@qawsed

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SQL ServerのT-SQLでのトランザクション処理で266エラーが発生

SQL Serverのプロシージャで266エラーが発生します。

例)
SQL Serverのプロシージャを現在作成していますが、
初めてのSQL Serverを触るため現状上手くいっていません。

作成したいプロシージャとしては、
他のプロシージャでも使用する共通のプロシージャを呼び出して処理していきたいです。

共通のプロシージャからエラーの場合はRETURNで1が帰り、
@ERR_MSGに共通プロシージャからエラーメッセージが来ます。(ここまでは確認済みです)

TRANSACTIONの途中で、共通プロシージャを使用した処理で、エラー(RETURN 1)が発生した場合、
エラーが発生してた時点より前で処理をした、共通プロシージャの処理を含めてロールバックしたいです。
(エラーより上の処理をCOMMITしたくないです。)
その後@ERR_MSGのエラー内容をPRINTしたいです。

しかし、下記のようなプロシージャ作成したのですが、266エラーが発生しました。

発生している問題・エラー

EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致していないことを示しています。以前の数 = 1、現在の数 = 0。

上記のようなエラーが現状発生しています。

作成したプロシージャ(t-sql)

CREATE PROCEDURE T_SQL1
    -- 画面から値を取得
    @p0 NVARCHAR(10),           -- 値0
    @p1 NVARCHAR(10),           -- 値1
AS

BEGIN
    -- 変数宣言
    DECLARE @returnValue INT = 0;                -- 受け取り用
    DECLARE @ERR_MSG NVARCHAR(300);              -- 別プロシージャからエラーメッセージを取得

    BEGIN TRY
        BEGIN TRANSACTION;

            -- 処理1
            EXEC @returnValue = T_SQL2
                @id = @p0                     -- 値1
                , @code = @p1                 -- 値2
                , @errMSG = @ERR_MSG OUTPUT;  -- エラーメッセージ取得

            -- returnValueが1(エラー)の場合
            IF @returnValue = 1
            BEGIN
                ROLLBACK TRANSACTION;
                RETURN;                       -- ロールバックし処理終了
            END;

            -- 処理2
            EXEC @returnValue = T_SQL3
                @id = @p0                     -- 値1
                , @code = @p1                 -- 値2
                , @errMSG = @ERR_MSG OUTPUT;  -- エラーメッセージ取得

            -- returnValueが1(エラー)の場合
            IF @returnValue = 1
            BEGIN
                ROLLBACK TRANSACTION;         -- ロールバックし処理終了
                RETURN;
            END;

        -- コミット
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        -- ロールバック
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

        PRINT @errMSG;

    END CATCH;
END;

自分で試したこと

ROLLBACK TRANSACTION;の後に、RETURNではなく、THROWなども試しましたが、上手く動きませんでした。

0 likes

1Answer

最後のCatch文の中のIFの条件を無くし、ロールバックを外に出して試してみて下さい。

直近で同様のエラーを踏んで解消したときの知見で説明しますと、本エラーはトランザクションが開始して終了しないルートがある場合に発生します。間違っているかもしれませんがご確認下さい。

0Like

Your answer might help someone💌