Lorsque nous sommes obligés d'utiliser SQL dynamique dans une procédure stockée, nous procédons comme suit. ajouter une variable d'entrée de débogage qui est un champ de bits. Si c'est 0, l'instruction exec sera traitée si c'est 1 alors vous obtiendrez une instruction d'impression à la place. Je vous suggère de faire quelque chose de similaire pour déboguer. Au lieu de l'exécuter, imprimez les résultats de votre SQL ou insérez éventuellement le SQl dans une table car cela semble se produire en boucle. Ensuite, vous pouvez examiner le sql qui a été construit et voir où cela s'est mal passé.
Declare debug bit
set debug = 1
...
if debug = 1 Begin Print @SQL End
Else
Begin Exec (@sql) End
Alternativement
Créez une table appelée mydynamiccode_logging (avec une colonne sql de la même longueur que l'instruction sql max, une rundatecolumn et toutes les autres colonnes que vous pourriez juger nécessaires (je considérerais les variables d'entrée utilisées pour constituer l'instruction sql, l'utilisateur, l'application si plusieurs utilisent ce morceau de code)
Avant d'exécuter l'instruction exec, exécutez quelque chose comme ceci :
insert mydynamiccode_logging (sql, rundate)
values (@sql, getdate())
Maintenant, vous pouvez également ajouter le champ de bits de débogage et ne vous connecter que lorsque vous l'avez changé en mode débogage ou vous pouvez toujours vous connecter, cela dépend du système et du temps supplémentaire que cela prend et à quel point le reste du système est claqué. Vous ne voulez pas ralentir considérablement la production en vous connectant.