Я применил заплату инструментов данных 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#?