Отладка 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.