Я применил патч Данных Данных 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 С#?