Когато сме принудени да използваме динамичен sql в съхранена процедура, ние правим следното. добавете входна променлива на debug, която е битово поле. Ако е 0, командата exec ще обработи, ако е 1, тогава вместо това ще получите команда за печат. Предлагам ви да направите нещо подобно за отстраняване на грешки. Вместо да изпълнявате, отпечатайте резултатите от вашия SQL или евентуално вмъкнете SQl в таблица, тъй като изглежда, че се случва в цикъл. След това можете да прегледате изградения sql и да видите къде се е объркал.
Declare debug bit
set debug = 1
...
if debug = 1 Begin Print @SQL End
Else
Begin Exec (@sql) End
Алтернативно
Създайте таблица, наречена mydynamiccode_logging (с sql колона със същата дължина като max sql израза, rundatecolumn и каквито други колони може да сметнете за необходими (бих разгледал входните променливи, използвани за съставяне на sql израза, потребителя, приложението ако повече от един използва тази част от кода)
Преди да изпълните командата exec, изпълнете нещо подобно:
insert mydynamiccode_logging (sql, rundate)
values (@sql, getdate())
Сега можете също да добавите битовото поле за отстраняване на грешки и да регистрирате само когато сте го променили на режим за отстраняване на грешки или винаги можете да влезете, зависи от системата и колко допълнително време отнема това, за да направите това и колко е затлачена останалата част от системата. Не искате да забавяте значително prod чрез регистриране.