10

この記事で SQL Server のエラー処理について読んでいましたが、特定の状況で SQL Server の GOTO を使用してトランザクションをロールバックすることを提案しています。例:

BEGIN TRAN
    UPDATE Authors
    SET Phone = '415 354-9866'
    WHERE au_id = '724-80-9391'

    SELECT @intErrorCode = @@ERROR
    IF (@intErrorCode <> 0) GOTO PROBLEM

    UPDATE Publishers
    SET city = 'Calcutta', country = 'India'
    WHERE pub_id = '9999'

    SELECT @intErrorCode = @@ERROR
    IF (@intErrorCode <> 0) GOTO PROBLEM
COMMIT TRAN

PROBLEM:
IF (@intErrorCode <> 0) BEGIN
PRINT 'Unexpected error occurred!'
    ROLLBACK TRAN
END

この記事は 10 年近く前に書かれたもので、通常 GOTO を使用するのはよくないと聞きました。上記は、SQL Server でエラーを処理するための適切な方法ですか? そうでない場合、誰かがより良い代替案を提案できますか?

4

2 に答える 2

19

SQL 2005 以降ではTry/Catchを使用する必要があります

BEGIN TRY
    BEGIN TRAN

    UPDATE Authors
    SET Phone = '415 354-9866'
    WHERE au_id = '724-80-9391'

    UPDATE Publishers
    SET city = 'Calcutta', country = 'India'
    WHERE pub_id = '9999'

    COMMIT TRAN        
END TRY
BEGIN CATCH
    PRINT 'Unexpected error occurred!'
    IF XACT_STATE() <> 0
        ROLLBACK TRAN    
END CATCH
于 2012-06-21T15:45:23.093 に答える
8

組み込む必要がありSET XACT_ABORT ONますException handling

Begin Try
SET XACT_ABORT ON

BEGIN TRAN
    UPDATE Authors
    SET Phone = '415 354-9866'
    WHERE au_id = '724-80-9391'

    UPDATE Publishers
    SET city = 'Calcutta', country = 'India'
    WHERE pub_id = '9999'
COMMIT TRAN

End Try

Begin Catch
    Rollback Tran
End Catch
于 2012-06-22T08:52:41.713 に答える