以下は、私が使用するストアド プロシージャ テンプレートの一部です:
/* CREATE PROCEDURE... */
DECLARE
@ErrorMessage varchar(2000)
,@ErrorSeverity tinyint
,@ErrorState tinyint
/* Additional code */
BEGIN TRY
/* Your code here */
END TRY
BEGIN CATCH
SET @ErrorMessage = ERROR_MESSAGE()
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorState = ERROR_STATE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
BREAK
END CATCH
/* Further cleanup code */
Try/Catch ブロックは扱いにくい場合がありますが、@@error よりもはるかに完全です。さらに重要なことは、それらの中でさまざまな error_xxx() 関数を使用できることです。ここでは、適切なエラー メッセージを変数 @ErrorMessage に格納し、エラーを再発生させるのに十分な他のデータを格納します。ここから、任意の数のオプションを利用できます。 @ErrorMessage を出力変数にしたり、特定のエラーをテストして処理したり、独自のエラー メッセージを作成したりできます (または、既存のメッセージをより明確にするために調整します。どのくらいの頻度でそれを行う必要があるかを知るのにイライラするかもしれません)。他のオプションはそれらのレベルを提示します。
注意すべき点:状況によっては、SQL は 2 つのエラー メッセージを続けてスローします... および error_message()
通常、「オブジェクトを作成しようとして失敗しました」などのメッセージが表示され、最初のエラー メッセージに実際のエラーが表示されます。ここで、独自のエラー メッセージを作成する必要があります。