Ошибка хранимой процедуры EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT - PullRequest
0 голосов
/ 25 января 2019

У меня есть хранимая процедура, которая работает нормально, когда я удаляю Select 1/0 (это для проверки, если хранимая процедура ловит ошибку), но когда у меня есть Select 1/0 в хранимой процедуре, она выдает ошибку

Количество транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT. Предыдущий счет = 0, текущий счет = 1

Я пытался применить решение из TSQL Try / Catch в транзакции или наоборот? , но все равно я получаю ту же ошибку.

ALTER PROCEDURE [dbo].[PTA_Processing_D365]
AS
    BEGIN TRY
    BEGIN TRANSACTION test1
        UPDATE table A
        ....
        ......
        ......;

        INSERT INTO table A(.....)
            SELECT .....
            FROM table b
            WHERE .....;

        SELECT 1/0

        ROLLBACK TRANSACTION test1
    END TRY
    BEGIN CATCH
        INSERT INTO tableA_ErrorLog ([ExecutedDate], [ERROR_NUMBER], [ERROR_SEVERITY], 
                                     [ERROR_STATE], [ERROR_PROCEDURE], [ERROR_LINE], [ERROR_MESSAGE])
            SELECT 
                GETDATE(), ERROR_NUMBER(), ERROR_SEVERITY(), 
                ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE()
   END CATCH

1 Ответ

0 голосов
/ 25 января 2019

Поскольку ваша текущая настройка не позволяет вам COMMIT транзакцию, вам нужно добавить COMMIT в блок TRY и переместить ROLLBACK в блок CATCH,Что-то вроде ниже.Снова, читайте в длинном блоге Эрланда по обработке ошибок, чтобы найти лучшие способы и другие вещи, которые вы должны включить, например SET XACT_ABORT ON:

ALTER Procedure [dbo].[PTA_Processing_D365]
as

BEGIN TRY
BEGIN TRANSACTION test1

    update table A
    ....
    ......
    ......
    ;
    insert into table A
    (.....
    ....
    ....)
    Select .....
    ....
    ..... from table b
    where .....;

    select 1/0

COMMIT TRAN test1
END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN test1
    INSERT INTO tableA_ErrorLog
               ([ExecutedDate]
               ,[ERROR_NUMBER]
               ,[ERROR_SEVERITY]
               ,[ERROR_STATE]
               ,[ERROR_PROCEDURE]
               ,[ERROR_LINE]
               ,[ERROR_MESSAGE])
    select GetDate (), ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE()
END CATCH
...