Stampa parametri in Dynamic SQL


9

Ho usato SQL dinamico per molte attività e ho riscontrato continuamente lo stesso problema: stampare i valori delle variabili utilizzate all'interno dell'istruzione Dynamic T-SQL.

PER ESEMPIO:

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

I risultati di stampa del codice sopra riportato sono semplicemente "Seleziona @Foobar". Esiste un modo per stampare dinamicamente i valori e i nomi delle variabili di sql in esecuzione? O quando si esegue la stampa, sostituire i parametri con i loro valori effettivi in ​​modo che SQL sia nuovamente eseguibile?

Ho giocato con la creazione di una o due funzioni per realizzare qualcosa di simile, ma con conversioni di tipi di dati, problemi di troncamento di corrispondenza dei modelli e soluzioni non dinamiche. Sono curioso di sapere come gli altri sviluppatori risolvano questo problema senza stampare manualmente ogni singola variabile manualmente.

Risposte:


4

Un modo per farlo è probabilmente qualcosa che hai già fatto, e cioè sostituire la tua linea:

if @DebugMode=1 print @SQL

con

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

E dovresti farlo in questo modo per tutte le tue variabili, dovrai convertirle manualmente per evitare errori di conversione.

È inoltre possibile utilizzare RAISERROR in modo simile:

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

HTH


Sfortunatamente ciò significherebbe scrivere manualmente i sostituti per ciascuna variabile utilizzata nell'istruzione dinamica. Ciò può diventare ingombrante quando vengono utilizzate e modificate più di 20 variabili o quando vengono create contemporaneamente più istruzioni sql dinamiche.
Brent D,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.