Parâmetros de impressão no SQL dinâmico

9

Eu usei o SQL dinâmico para muitas tarefas e continuamente enfrento o mesmo problema: Impressão de valores de variáveis ​​usadas dentro da instrução Dynamic T-SQL.

POR EXEMPLO:

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

Os resultados de impressão do código acima são simplesmente "Selecione @Foobar". Existe alguma maneira de imprimir dinamicamente os valores e nomes de variáveis ​​do sql que está sendo executado? Ou, ao imprimir, substitua os parâmetros pelos valores reais para que o SQL possa ser executado novamente?

Eu brinquei com a criação de uma função ou duas para realizar algo semelhante, mas com conversões de tipo de dados, problemas de truncamento de correspondência de padrões e soluções não dinâmicas. Estou curioso para saber como outros desenvolvedores resolvem esse problema sem imprimir manualmente cada variável manualmente.

Brent D
fonte

Respostas:

4

Uma maneira de fazer isso é provavelmente algo que você já fez e é substituir sua linha:

if @DebugMode=1 print @SQL

com

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

E você teria que fazê-lo dessa maneira para todas as suas variáveis, precisará convertê-las manualmente para evitar erros de conversão.

Você também pode usar o RAISERROR de maneira semelhante:

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

HTH

SQLRockstar
fonte
Infelizmente, isso significaria a substituição manual de substituições para cada variável usada na instrução dinâmica. Isso pode ficar complicado quando mais de 20 variáveis ​​são usadas e alteradas ou quando várias instruções sql dinâmicas estão sendo construídas simultaneamente.
Brent D