3

この StackOverflow の回答は、TRY CATCH ROLLBACK TRANSACTION を使用する洗練された方法を提供しますが、エラー情報を抑制します。

そもそもロールバックの原因となったエラーを抑制しないトランザクションをロールバックする方法はありますか?

上記の方法に基づく T-SQL スクリプトの例を次に示します。

DECLARE @Table TABLE ( ID INT PRIMARY KEY )

BEGIN TRY

    BEGIN TRANSACTION

        INSERT INTO @Table VALUES (1), (1)

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION

END CATCH;

ありがとう!

4

2 に答える 2

5

Catch ステートメントで、エラー コードとメッセージを取得します。その後、単純にもう一度 RAISE します。以下にいくつかの例を示します。

http://technet.microsoft.com/en-us/library/ms175976.aspx

(コメントのRBarryYoungごと)

CATCH句では、THROW を使用するだけです

于 2013-08-21T21:07:21.480 に答える
1

後世のために、SQL Server 2008R の THROW に相当するものをここに含めます。

これは、次のページの「CATCH ブロックからエラー情報を返す」というラベルの付いたセクションからのものです。

http://technet.microsoft.com/en-us/library/ms178592(v=sql.105).aspx

BEGIN TRY
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block.
    RAISERROR ('Error raised in TRY block.', -- Message text.
               16, -- Severity.
               1 -- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    -- Use RAISERROR inside the CATCH block to return error
    -- information about the original error that caused
    -- execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;
于 2013-08-21T21:36:30.580 に答える