Wenn wir gezwungen sind, dynamisches SQL in einer gespeicherten Prozedur zu verwenden, gehen wir wie folgt vor. fügen Sie eine Eingabevariable von debug hinzu, die ein Bitfeld ist. Wenn es 0 ist, wird die exec-Anweisung verarbeitet, wenn es 1 ist, dann erhalten Sie stattdessen eine print-Anweisung. Ich schlage vor, Sie tun etwas Ähnliches zum Debuggen. Anstatt auszuführen, drucken Sie die Ergebnisse Ihrer SQL oder fügen Sie die SQL möglicherweise in eine Tabelle ein, da dies in einer Schleife zu geschehen scheint. Dann können Sie sich das erstellte SQL ansehen und sehen, wo es schief gelaufen ist.
Declare debug bit
set debug = 1
...
if debug = 1 Begin Print @SQL End
Else
Begin Exec (@sql) End
Alternativ
Erstellen Sie eine Tabelle namens mydynamiccode_logging (mit einer SQL-Spalte, die dieselbe Länge wie die maximale SQL-Anweisung hat, einer rundatecolumn und allen anderen Spalten, die Sie möglicherweise für erforderlich halten (ich würde die Eingabevariablen berücksichtigen, die zum Erstellen der SQL-Anweisung verwendet werden, den Benutzer, die Anwendung wenn mehr als einer dieses Stück Code verwendet)
Bevor Sie die exec-Anweisung ausführen, führen Sie etwa Folgendes aus:
insert mydynamiccode_logging (sql, rundate)
values (@sql, getdate())
Jetzt könnten Sie auch das Debug-Bit-Feld hinzufügen und nur protokollieren, wenn Sie es in den Debug-Modus geändert haben, oder Sie könnten immer protokollieren, hängt vom System ab und wie viel zusätzliche Zeit dafür benötigt wird und wie der Rest des Systems zugeschlagen ist. Sie möchten die Produktion nicht durch Protokollierung erheblich verlangsamen.