2011-07-22 15 views
2

別のストアドプロシージャを呼び出すストアドプロシージャがあります。 SP2にはtry/transaction/catch/rollback/raiserrorがあります。 SP2でエラーが発生した場合は、SP1を呼び出して呼び出し元に送信されますか、またはSP2への呼び出しをtry/catchでネストする必要がありますか?後者の場合、どうすればSP1を起動/終了するときにSP2からのエラーの「スタックトレース」を殺していないことを保証できますか?他のストアドプロシージャを呼び出すストアドプロシージャ内の例外フロー

- これはSP2からのエラーを吹き飛ばし、SP1も終了しますか?

EXEC dbo.storedProc2 @someParameter = @someValue 

- これを行う必要がありますか?

BEGIN TRY 
    EXEC dbo.storedProc2 @someParameter = @someValue 
END TRY 
BEGIN CATCH 
    -- this is what I normally do in a simple catch/raise scenario: 
    -- will it kill the error stack? 
    DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT, @ErrState INT, @ErrLine INT 
    SELECT @ErrMsg = ERROR_MESSAGE() + ' Line %d', 
      @ErrSeverity = ERROR_SEVERITY(), 
      @ErrState = ERROR_STATE(), 
      @ErrLine = ERROR_LINE() 
    RAISERROR(@ErrMsg, @ErrSeverity, @ErrState, @ErrLine) 
END CATCH 

答えて

2

あなたは外TRY/CATCHブロックを持っている必要があります。

SP2でエラーがトラップされているだけであれば、SP2エラーが発生すると中止されます。
その後、エラーコードがSP1に戻されますが、ほとんどの状況でSP1は引き続き実行されます(例外は重大度20-25の致命的なエラーです)。

TRY/CATCHを使用せずに本物のエラートラップはありません(古い学校の場合は@@Errorをチェックしてください)。このコードは、より良い方法と悪い方法のどちらでも実行し続けます。あなたがトラップべきとリターンを使用してエラーコードを返す次にdbo.storedProc2

WITHINエラーの対処方法N

SP1は、その後どのような方法でそのエラー(複数可)に対処することができます

+0

私の質問の例でエラーがSP1の@Err変数に引き上げられますか? –

+0

@AJ - すべての 'SP'コールに対してリターンコードと出力パラメタを使用しない限り、そうは思いません。 – JNK

0

が必要です。

関連する問題