Gdy zostaniemy zmuszeni do użycia dynamicznego sql w zapisanym proc, wykonujemy następujące czynności. dodaj zmienną wejściową debugowania, która jest polem bitowym. Jeśli jest to 0, instrukcja exec zostanie przetworzona, jeśli będzie to 1, zamiast tego otrzymasz instrukcję print. Proponuję zrobić coś podobnego do debugowania. Zamiast wykonywać, wydrukuj wyniki swojego kodu SQL lub ewentualnie wstaw SQl do tabeli, ponieważ wydaje się, że dzieje się to w pętli. Następnie możesz przejrzeć zbudowany sql i zobaczyć, gdzie poszło nie tak.
Declare debug bit
set debug = 1
...
if debug = 1 Begin Print @SQL End
Else
Begin Exec (@sql) End
Alternatywnie
Utwórz tabelę o nazwie mydynamiccode_logging (z kolumną sql o tej samej długości co instrukcja max sql, kolumną rundate i innymi kolumnami, które uznasz za niezbędne (rozważę zmienne wejściowe użyte do utworzenia instrukcji sql, użytkownika, aplikacji jeśli więcej niż jeden używa tego fragmentu kodu)
Przed uruchomieniem instrukcji exec uruchom coś takiego:
insert mydynamiccode_logging (sql, rundate)
values (@sql, getdate())
Teraz możesz również dodać pole bitu debugowania i rejestrować tylko wtedy, gdy zmieniłeś go w tryb debugowania lub zawsze możesz logować, w zależności od systemu i ile dodatkowego czasu to zajmuje i jak trzaśnięta jest reszta systemu. Nie chcesz znacząco spowalniać prod przez logowanie.