Position du bloc TRY / CATCH pour la procédure stockée SQL Server

Je voudrais connaître la meilleure position d'un TRY/CATCH pour une procédure T-SQL et pourquoi

Dans la déclaration:

 CREATE PROCEDURE procedure_name AS BEGIN -- Code BEGIN TRY sql_statement END TRY BEGIN CATCH -- Handle errors END CATCH --Code END 

ou dans l'appel:

 BEGIN TRY EXEC procedure_name END TRY BEGIN CATCH -- Handle errors END CATCH 

J'irais pour la première option.

 BEGIN TRY sql_statement END TRY BEGIN CATCH -- Handle errors END CATCH 

La raison en est que vous voulez attraper les erreurs à la source et ensuite prendre des mesures appropriées.

Dans la deuxième option, vous laissez l'erreur monter en flèche et vous n'aurez pas access à toutes les informations d'erreur exactes renvoyées par les fonctions d'erreur dans le bloc catch.

Par exemple, la fonction ERROR_LINE() returnnera le numéro de ligne de la procédure d'appel où il appelle la procédure contenant le code sql réel, vous voudrez connaître le numéro de la ligne d'erreur où l'exception réelle a été lancée, cette information est seulement disponible dans le bloc catch de la procédure appelée.

Morale de l'histoire est d'essayer d'attraper des exceptions aussi près de la source que possible.