Параметры печати в динамическом SQL


9

Я использовал динамический SQL для многих задач и постоянно сталкиваюсь с одной и той же проблемой: печать значений переменных, используемых внутри инструкции Dynamic T-SQL.

НАПРИМЕР:

Declare @SQL nvarchar(max), @Params nvarchar(max), @DebugMode bit, @Foobar int
select @DebugMode=1,@Foobar=364556423

set @SQL='Select @Foobar'
set @Params=N'@Foobar int'

if @DebugMode=1 print @SQL
exec sp_executeSQL @SQL,@Params
    ,@Foobar=@Foobar

Результаты печати приведенного выше кода просто "Выберите @Foobar". Есть ли способ динамически печатать значения и имена переменных выполняемого SQL? Или при выполнении печати замените параметры их фактическими значениями, чтобы SQL можно было повторно запускать?

Я играл с созданием одной или двух функций для выполнения чего-то похожего, но с преобразованиями типов данных, проблемами усечения соответствия шаблонов и не динамическими решениями. Мне любопытно, как другие разработчики решают эту проблему, не печатая вручную каждую переменную вручную.

Ответы:


4

Один из способов сделать это, вероятно, то, что вы уже сделали, и это заменить вашу строку:

if @DebugMode=1 print @SQL

с

if @DebugMode=1 print @SQL + ' ' + convert(nvarchar(max), @Foobar)

И вам придется сделать это таким образом для всех ваших переменных, вам нужно будет преобразовать их вручную, чтобы избежать ошибок преобразования.

Вы также можете использовать RAISERROR аналогичным образом:

if @DebugMode=1 RAISERROR (N'We used a value of %d for @Foobar', 10, 1, @Foobar)

НТН


К сожалению, это будет означать ручную запись замен для каждой переменной, используемой в динамическом операторе. Это может быть громоздким, когда более 20 переменных используются и изменяются или когда одновременно создается несколько динамических SQL-операторов.
Brent D
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.