2 votes

Sp_executesql à l'intérieur de Try & Catch

Début Try
Déclarer @SQL NVarchar(Max)='Exec [MyLinkedServer].master.dbo.sp_executesql N''Drop Table [tempdb].dbo.[T1]''';
Print   @SQL;
Exec master.dbo.sp_executesql @SQL;
Fin Try
Début Catch
Print Error_Message()
End Catch

Le script ci-dessus échoue lorsque la table T1 n'existe pas dans MyLinkedServer au lieu d'être dirigé vers la section Catch. Qu'est-ce que j'ai raté?

Juste pour être clair : la procédure d'origine construit le @SQL de manière dynamique à l'intérieur d'une procédure en utilisant des paramètres.

Merci!

1voto

Remus Rusanu Points 159382

Non, le script ci-dessus ne fonctionne pas et se déroule exactement comme vous vous y attendez :

Begin Try
Declare @SQL NVarchar(Max)='Exec [MyLinkedServer].master.dbo.sp_executesql N''Drop Table [tempdb].dbo.[T1]''';
Print   @SQL;
Exec master.dbo.sp_executesql @SQL;
End Try
Begin Catch
print 'dans le catch'
Print Error_Message()
End Catch

Exec [MyLinkedServer].master.dbo.sp_executesql N'Drop Table [tempdb].dbo.[T1]'
dans le catch
Impossible de trouver le serveur 'MyLinkedServer' dans sys.servers. Vérifiez que le nom du serveur correct a été spécifié. Si nécessaire, exécutez la procédure stockée sp_addlinkedserver pour ajouter le serveur à sys.servers.

Voyez ce message 'dans le catch' ? C'est la preuve que le bloc catch a été exécuté.

Mais vous avez raison, il y a en effet un problème bien connu selon lequel les erreurs de compilation ne peuvent pas être capturées dans l'étendue où elles se produisent. Ce qui est tout à fait attendu, c'est comme demander à un bloc catch dans un programme C# de s'exécuter lorsque le code ne compile pas... Le problème est bien expliqué en détail à l'adresse Gestion des erreurs en SQL 2005 et ultérieurs. Vous devez créer une portée externe pour capturer l'erreur de compilation qui se produit dans la portée interne. Ce qui est exactement ce que vous faites dans votre exemple posté !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X