Отладка SSDT SQL Server не достигает точек останова CLR

Я применил заплату инструментов данных SQL Server к Visual Studio 2012 (Premium) и создал проект пользовательской функции SQL Server CLR на C#:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlInt32 Add42(SqlInt32 in_param)
    {
        SqlInt32 retval = in_param + 42;  // Set break point here.
        return retval;
    }
}

В панели обозревателя объектов SQL Server я щелкаю правой кнопкой мыши только что опубликованную пользовательскую функцию и выбираю «Выполнить функцию…». SQL Server и генерирует скрипт, который выглядит следующим образом:

DECLARE    @return_value Int

EXEC    @return_value = [dbo].[Add42] @in_param = 5

SELECT    @return_value as 'Return Value'

GO

... и выполняет его, возвращая ожидаемый результат 47.

Если я сейчас поставлю точку останова на исполняемую строку в моем коде C# UDF CLR, щелкну правой кнопкой мыши функцию UDF в обозревателе объектов SQL Server и на этот раз выберу «Функция отладки...», я попаду в отладчик для сгенерированного SQL тестовый скрипт. Я могу выполнить операторы SQL до конца сценария, который возвращает правильный результат, но точка останова в моем коде C# никогда не достигается в отладчике C#.

Терминология для этой функции кажется вводящей в заблуждение. Для любого программиста "отладка" функции означает пошаговое выполнение исполняемых строк в коде самой функции. Простое создание тестовой системы SQL, которая вызывает мою скомпилированную функцию и возвращает результат, просто «тестирует» функцию. В лучшем случае единственное, что «отлаживается», — это сам тест, созданный инструментом, потому что вы не можете «вступить» в код CLR. Единственный вариант — «Перешагнуть».

Итак, как мне заставить Visual Studio фактически отлаживать и достигать точки останова в моем коде UDF C#?


person Buggieboy    schedule 29.10.2013    source источник
comment
Пробовали ли вы выполнить шаги этого документа MSDN, чтобы узнать, вы пропустили шаг?   -  person Scott Chamberlain    schedule 06.11.2013
comment
@Scott - я пытался, но после рассказа вам, как создать функцию SQL CLR или sproc - что я, очевидно, уже сделал - все, что в этой статье дает вам, это отладка Visual Studio 101. Вы знаете: щелкните правой кнопкой мыши строку и выберите «переключить точку останова» и т. д. Затем в нем говорится «Добавить скрипт, который проверяет тип». В обозревателе решений разверните каталог TestScripts и дважды щелкните Test.sql. Я не вижу каталога TestScripts в обозревателе решений ни в 2012, ни в 2010 году, так что я понятия не имею, о чем они говорят.   -  person Buggieboy    schedule 06.11.2013


Ответы (4)


Хорошо, я наконец понял это. Для отладки кода SQL CLR в VS 2012:

  1. Создайте тестовый сценарий SQL, который вызывает UDF, sproc или другой объект CLR. (Вы можете сделать это, используя параметры «Выполнить функцию» или «Отладить функцию» в обозревателе объектов сервера, как описано в вопросе.)

  2. Сохраните созданный скрипт. (По умолчанию он будет называться что-то вроде «SQLQuery1.sql». Вы можете дать ему более осмысленное имя.)

  3. В обозревателе решений щелкните правой кнопкой мыши проект UDF (или другого типа CLR) и выберите «Свойства».

  4. Откроется вкладка свойств проекта. Слева выберите категорию «Отладка».

  5. В подкатегории «Начать действие» панели «Отладка» выберите переключатель «Сценарий запуска:». Это активирует соответствующий раскрывающийся список, чтобы вы могли указать сценарий .sql, созданный на шаге 1.

  6. Сохраните все, переключите точку останова на исполняемую строку кода C# или другого языка .NET и нажмите кнопку отладки.

ПРИМЕЧАНИЕ. Теперь может появиться диалоговое окно с сообщением о том, что "Брандмауэр Windows заблокировал некоторые функции этой программы". Я поставил галочки, чтобы разрешить доступ к доменным и частным сетям.

Если продолжить сейчас, ваша точка останова будет достигнута.

person Community    schedule 08.11.2013
comment
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Также важно, чтобы в панели обозревателя объектов SQL Server вы щелкнули правой кнопкой мыши сервер и выбрали Разрешить отладку SQL/CLR! - person Buggieboy; 27.11.2013
comment
ТАКЖЕ ПРИМЕЧАНИЕ. Как указано ниже, вы должны запускать Visual Studio в режиме администратора. - person Buggieboy; 30.12.2013
comment
Следил за всем. В свойствах проекта базы данных или на панели подключений обозревателя серверов нет параметра «Разрешить отладку SQL/CLR». - person jwize; 17.07.2014
comment
Хорошо, перепутал обозреватель объектов SQL Server с обозревателем сервера - person jwize; 17.07.2014

Для Visual Studio 2015 + Update 2:

В панели SQL Server Object Explorer щелкните правой кнопкой мыши сервер и выберите «Разрешить отладку SQL/CLR»:

введите описание изображения здесь

В Server Explorer щелкните правой кнопкой мыши функцию, которую вы хотите отладить, и выберите Execute:

введите описание изображения здесь

Он сгенерирует код для вас. Выберите Execute with Debugger:

введите описание изображения здесь

Затем вы можете поместить точку останова в код C#, и она сработает.

Он попросит открыть порт в вашем брандмауэре и попросит подключиться к SQL Server.

person Contango    schedule 03.04.2016
comment
Это правильные шаги. Но я все еще получаю сообщение об ошибке при отладке. Совет состоит в том, чтобы запустить VS 2015 в повышенном режиме (т.е. запустить его от имени администратора), и это решает мою проблему (моя текущая среда — Windows 10 Pro + VS 2015 Update 3) - person jyao; 11.11.2016

Я не знаю, изменит ли это SSDT, но в VS2008 я отлаживаю .net UDF следующим образом:

  • Я развертываю его на своем локальном SQL-сервере,
  • затем я присоединяю VS к процессу SQL Server (меню Отладка/Присоединение к процессу/sqlserver.exe, если SQL Server работает как служба, требуется, чтобы VS был запущен от имени администратора).
  • Затем выполните некоторый код SQL, вызывающий UDF, например. грамм. в Студии управления. Возможно, это будет работать с SSDT в VS 2012.
person FrankPl    schedule 06.11.2013
comment
Фрэнк, в VS 2012 явное присоединение не требуется. См. Мой ответ выше. - person Buggieboy; 09.11.2013

Исправление, которое вы применили, может установить элементы VS, которые не входят в состав ежеквартального обновления Visual Studio. Я рекомендую вам установить последнее ежеквартальное обновление Visual Studio для VS 2012. .

person ΩmegaMan    schedule 07.11.2013
comment
Это было хорошее предложение, и я последовал ему и применил ежеквартальное обновление поверх моего патча SSDT. Однако это не изменило поведение отладки или структуру каталогов обозревателя решений. - person Buggieboy; 08.11.2013
comment
@Buggieboy Я работал над приложением для Windows Phone и установил надстройку Azure. Тогда мой эмулятор WP8 не подошел бы, потому что Azure установил компоненты в VS, которые были до моего текущего патча. Рад, что вы решили это. - person ΩmegaMan; 08.11.2013