TRY...CATCH ブロックから呼び出したときに戻りコードが NULL になる理由は、バッチの中止に関係している可能性があります。
あなたが言ったように、Microsoft SQL Serverは、リターンコードをキャプチャする方法でEXECutingストアドプロシージャのオプションをプログラマーに提供します:
EXEC @ReturnCode = YourStoredProc
ただし、次のように、TRY...CATCH ブロック内からストアド プロシージャを呼び出すオプションもあります。
BEGIN TRY
EXEC YourStoredProc
END TRY
BEGIN CATCH
<handle error>
END CATCH
EXEC @ReturnCode = YourStoredProc
TRY...CATCH ブロックからストアド プロシージャを呼び出す場合は、ストアド プロシージャを呼び出す意味がないように思われます。(補足: コードに TRY...CATCH または明示的な 'RETURN n ' がない場合、RAISERROR は戻りコードを、エラー重大度 11 の場合は -1、12 の場合は -2、13 の場合は -3 などに設定します。 。ただし、重大度が 20 未満の場合、コードの実行は停止されないことに注意してください。)
TRY..CATCH メソッドは、エラーを処理するためのより多くのオプションと情報を提供します。CATCH ブロック内では、次のシステム関数を使用できます ( TRY...CATCH のドキュメントから取得)。
- ERROR_NUMBER() は、エラーの番号を返します。
- ERROR_SEVERITY() は重大度を返します。
- ERROR_STATE() はエラー状態番号を返します。
- ERROR_PROCEDURE() は、エラーが発生したストアド プロシージャまたはトリガーの名前を返します。
- ERROR_LINE() は、エラーの原因となったルーチン内の行番号を返します。
- ERROR_MESSAGE() は、エラー メッセージの完全なテキストを返します。テキストには、長さ、オブジェクト名、時間など、置換可能なパラメーターに指定された値が含まれます。
これらの関数の出力は、次のコードでテストできます。
BEGIN TRY
EXEC TestSP --A stored proc fashioned to cause an error
END TRY
BEGIN CATCH
SELECT
'ERROR_NUMBER()', ERROR_NUMBER(),''
UNION SELECT
'ERROR_SEVERITY()',ERROR_SEVERITY(),''
UNION SELECT
'ERROR_STATE() ',ERROR_STATE(),''
UNION SELECT
'ERROR_PROCEDURE()',0,ERROR_PROCEDURE()
UNION SELECT
'ERROR_LINE()',ERROR_LINE(),''
UNION SELECT
'ERROR_MESSAGE()',0,ERROR_MESSAGE()
END CATCH
最後に、TRY...CATCH ブロックから呼び出されたストアド プロシージャで RAISERROR を使用する場合、重大度 <= 10 はエラーとは見なされず、呼び出し元のコードで CATCH ブロックが起動されないことに注意してください。重大度が 11 以上の場合、CATCH ブロックが起動します。ほとんどの場合、RAISERROR では重大度レベル 16 を使用する必要があります。