-1

次の SQL Server ストアド プロシージャがあるとします。

CREATE PROC TestSP AS
select 'results selected' as column1
RAISERROR('this is an error',16,1)
--RETURN 3

こう呼ぶと、

DECLARE @ReturnCode int
EXEC @ReturnCode = TestSP
select @ReturnCode as ReturnCode

戻りコードは -6 になります。ALTER PROCストアド プロシージャの行のコメントを外して再度--RETURN 3呼び出すと、RETURN 3 がオーバーライドされ、リターン コードが 3 になります。

TRY...CATCH ブロック内からプロシージャを呼び出すと、

DECLARE @ReturnCode int
BEGIN TRY
    EXEC @ReturnCode = TestSP
END TRY
BEGIN CATCH
    PRINT 'An error occurred.'
END CATCH
SELECT @ReturnCode as ReturnCode

戻りコードは NULL になります。

戻りコード ( EXEC @ReturnCode = TestSP) の使用は、TRY...CATCH ブロック内からのストアド プロシージャの呼び出しと互換性がありませんか?

4

1 に答える 1

0

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 = YourStoredProcTRY...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 を使用する必要があります。

于 2015-10-28T22:59:50.803 に答える