Quando siamo obbligati a usare dynamic sql in un processo archiviato, facciamo quanto segue. aggiungi una variabile di input di debug che è un campo di bit. Se è 0, l'istruzione exec procederà se è 1, otterrai invece un'istruzione print. Ti suggerisco di fare qualcosa di simile per eseguire il debug. Invece di eseguire, stampa i risultati del tuo SQL o eventualmente inserisci l'SQl in una tabella poiché sembra che stia accadendo in un ciclo. Quindi puoi guardare l'SQL che è stato creato e vedere dove è andato storto.
Declare debug bit
set debug = 1
...
if debug = 1 Begin Print @SQL End
Else
Begin Exec (@sql) End
In alternativa
Crea una tabella chiamata mydynamiccode_logging (con una colonna sql della stessa lunghezza dell'istruzione sql max, una colonna rundate e qualsiasi altra colonna che potresti trovare necessaria (considererei le variabili di input utilizzate per comporre l'istruzione sql, l'utente, l'applicazione se più di uno utilizza questo pezzo di codice)
Prima di eseguire l'istruzione exec, esegui qualcosa del genere:
insert mydynamiccode_logging (sql, rundate)
values (@sql, getdate())
Ora puoi anche aggiungere il campo del bit di debug e registrare solo quando lo hai cambiato in modalità di debug oppure puoi sempre accedere, dipende dal sistema e da quanto tempo extra ci vuole per farlo e da quanto è sbattuto il resto del sistema. Non vuoi rallentare significativamente la puntura registrando.