Druckparameter in Dynamic SQL


9

Ich habe dynamisches SQL für viele Aufgaben verwendet und bin ständig auf dasselbe Problem gestoßen: Drucken von Werten von Variablen, die in der dynamischen T-SQL-Anweisung verwendet werden.

Z.B:

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

Die Druckergebnisse des obigen Codes lauten einfach "Select @Foobar". Gibt es eine Möglichkeit, die Werte und Variablennamen der ausgeführten SQL dynamisch zu drucken? Oder ersetzen Sie beim Drucken die Parameter durch ihre tatsächlichen Werte, damit SQL erneut ausgeführt werden kann?

Ich habe mit dem Erstellen einer oder zweier Funktionen gespielt, um etwas Ähnliches zu erreichen, aber mit Datentypkonvertierungen, Problemen beim Abschneiden von Mustervergleichen und nicht dynamischen Lösungen. Ich bin gespannt, wie andere Entwickler dieses Problem lösen, ohne jede Variable manuell zu drucken.

Antworten:


4

Eine Möglichkeit, dies zu erreichen, ist wahrscheinlich etwas, das Sie bereits getan haben, und das besteht darin, Ihre Leitung zu ersetzen:

if @DebugMode=1 print @SQL

mit

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

Und Sie müssten dies für alle Ihre Variablen auf diese Weise tun. Sie müssen sie manuell konvertieren, um Konvertierungsfehler zu vermeiden.

Sie können RAISERROR auch auf ähnliche Weise verwenden:

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

HTH


Leider würde dies bedeuten, dass für jede in der dynamischen Anweisung verwendete Variable manuell Ersetzungen geschrieben werden. Dies kann unhandlich werden, wenn mehr als 20 Variablen verwendet und geändert werden oder wenn mehrere dynamische SQL-Anweisungen gleichzeitig erstellt werden.
Brent D
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.