2012-02-17 15 views
0

以下のストアプロシージャコードの改善をお勧めする人はいませんか?SPエラーキャッチ

過去には、私のトランザクションをC#で処理してそこからロールバックするのが最良だったが、今はトランザクションを持ってSP自身にブロックをキャッチする必要がある。

私はSPのトランザクションの例をたくさん見つけましたが、キャッチブロックを試してみましたが、その多くは組み合わせていません。

私が知りたいのですが、以下のコードになるされています

  1. キャッチすべてのエラーの

  2. すべてのSPクラッ​​シュの危険性やタイミングを削除して、開いて、圧延ないトランザクションを残します戻る

  3. エラーが発生しても、SPコミットのすべてのリスクを除去します。返信Manjunatha Gouliため

    SET NOCOUNT ON; 
    SET XACT_ABORT ON; --used so transaction is not left open in the even of an error or timeout 
    
    DECLARE @Error int 
    
    BEGIN TRANSACTION 
        BEGIN TRY 
    
         INSERT INTO Locations_Internal (Loc_Ref, Loc_Code, Loc_Desc, Company_For_Desc, Row_Updated_PDA_Sync) 
    VALUES (@Loc_Ref, @Loc_Code, @Loc_Desc, @Company_For_Desc, 'invalid value'); 
    SELECT @Error [email protected]@ERROR; 
    IF @@ERROR <> 0 GOTO ERR_HANDLER;   
    
    --OTHER INSERT/DELETE/UPDATE Statements 
    
        END TRY 
        BEGIN CATCH 
         SET @Error = @@ERROR; 
          GOTO ERR_HANDLER; 
         END CATCH 
    
    
    COMMIT TRANSACTION 
    RETURN 0;  
    
    
    
    ERR_HANDLER: 
        SELECT 'Unexpected error occurred!' 
        ROLLBACK TRANSACTION 
        RETURN @Error 
    

おかげで、

うinsert文は失敗しますが、クラッシュしてそれだけでの残りの部分とに運ぶ例外をスローしない場合にはその仕事手順?これも可能ですか?

だけトランザクションを使用するか、またはすべてのエラーがキャッチでキャッチされるのではなくときに私は/ SELECT文をDELETE /すべてのINSERT/UPDATE後にチェック@@エラーを見てきた例のほとんどは、このアプローチはまだ必要とされるので、私は尋ねますコードを続行する。

try catchブロックを使用している場合、SPで@@ ERRORをチェックする必要がありますか? tryを実装していない旧バージョンのMS SQL向けに設計されたこの記事を参照している記事はありますか?

答えて

0

あなたが提起したすべての懸念に対処するには、次の方法を試すことができます。

トランザクションT1をBEGIN TRY BEGIN
INSERT INTO Locations_Internal(Loc_Ref、Loc_Code、Loc_Desc、Company_For_Desc、Row_Updated_PDA_Sync) VALUES(@Loc_Ref、@Loc_Code、@Loc_Desc、@Company_For_Desc、 '無効な値');

COMMIT TRANSACTION T1 
RETURN 0;   

ENDは がCATCH ROLLBACK TRANSACTION T1 RETURN @@ ERRORをBEGIN TRY。 END CATCH