Отладка SQL-сервера SSDT не влияет на точки останова CLR
Я применил патч Данных Данных SQL Server к Visual Studio 2012 (Premium) и создал пользовательский проект функций SQL Server CLR в С#:
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" щелкните правой кнопкой мыши на недавно опубликованном UDF и выберите "Execute Function...". Мне предлагается указать примерное значение ввода, а Visual Studio затем публикует функцию (снова) для мой локальный SQL Server 2012 и генерирует script, который выглядит следующим образом:
DECLARE @return_value Int
EXEC @return_value = [dbo].[Add42] @in_param = 5
SELECT @return_value as 'Return Value'
GO
... и выполняет его, возвращая ожидаемый результат из 47.
Если теперь поставить точку прерывания на исполняемую строку в коде CLR UDF С#, щелкните правой кнопкой мыши функцию UDF в обозревателе объектов SQL Server и на этот раз выберите "Debug Function...", я приземлюсь в отладчике для сгенерированного теста SQL script. Я могу выполнить инструкции SQL в конце script, который возвращает правильный результат, но точка останова в моем С# -кодеке никогда не достигается в отладчике С#.
Терминология для этой функции кажется вводящей в заблуждение. Для любого программиста "отладка" функции означает переход через исполняемые строки в код самой функции. Просто создавая тестовую жгуту SQL, которая вызывает мою скомпилированную функцию и возвращает результат, просто "тестирует" эту функцию. В лучшем случае единственное, что "отлаживается", - это сам тест, созданный с помощью инструмента, потому что вы не можете "перейти на" код CLR. Единственный вариант - это "Step Over".
Итак, как мне заставить Visual Studio фактически отлаживать и ударить точку останова в моем коде UDF С#?
Ответы
Ответ 1
Хорошо, я, наконец, понял это. Чтобы отладить SQL CLR-код в VS 2012:
-
Создайте тест SQL script, который вызывает UDF, sproc или другой объект CLR.
(Вы можете сделать это, используя опцию "Выполнить функцию" или "Функция отладки" в
Server Object Explorer, как описано в вопросе.)
-
Сохраните сгенерированный script. (Это будет называться чем-то вроде "SQLQuery1.sql" по умолчанию. Возможно, вы захотите дать ему больше значащее имя.)
-
В обозревателе решений щелкните правой кнопкой мыши UDF (или другой тип CLR) проекта и выберите "Свойства".
-
Откроется вкладка свойств проекта. Слева выберите Категория "Отладка".
-
В подкатегории "Начать действие" панели "Отладка" выберите "Запуск script:" переключатель. Это позволит связать выпадающее меню так, чтобы вы можете указать .sql script, созданный на шаге 1.
-
Сохранить все, переключить точку останова на исполняемую строку вашего С# или другого языка .NET и нажмите кнопку отладки.
ПРИМЕЧАНИЕ. Теперь вы можете получить диалоговое окно с сообщением о том, что "Брандмауэр Windows заблокировал некоторые функции этой программы". Я проверил поля, чтобы разрешить доступ к доменам и частным сетям.
Выполнение теперь должно привести к достижению точки останова.
Ответ 2
Для Visual Studio 2015
+ Update 2
:
В области SQL Server Object
Проводник щелкните правой кнопкой мыши на сервере и выберите "Разрешить отладку SQL/CLR":
![введите описание изображения здесь]()
В Server Explorer
щелкните правой кнопкой мыши на функции, которую вы хотите отладить, и выберите Execute
:
![введите описание изображения здесь]()
Он будет генерировать код для вас. Выберите Execute with Debugger
:
![введите описание изображения здесь]()
Затем вы можете поместить контрольную точку в свой код С#, и она ударит ее.
Он попросит открыть порт в вашем брандмауэре и попросит его подключиться к SQL Server
.
Ответ 3
Я не знаю, изменит ли SSDT это, но в VS2008 я отлаживаю UDF.net следующим образом:
- Я развожу его на локальный SQL-сервер,
- то я присоединяю VS к процессу SQL Server (меню Debug/Attach to process/sqlserver.exe, если SQL Server работает как служба, для которого требуется, чтобы VS был запущен как администратор).
- Затем выполните код SQL, вызывающий UDF, e. г. в Management Studio. Возможно, это сработает с SSDT в VS 2012.
Ответ 4
Патч, который вы применили, может устанавливать элементы VS, которые не соответствуют текущему обновлению Visual Studio Quarterly. Я рекомендую вам применить последнее ежеквартальное обновление Visual Studio для VS 2012.