存储过程错误EXECUTE表示BEGIN和COMMIT语句的数量不匹配

时间:2019-01-25 15:34:39

标签: sql sql-server tsql sql-server-2016

我有一个存储过程,当我删除Select 1/0(这是为了测试存储过程是否捕获错误)时工作正常,但是当我在存储过程中有Select 1/0时,它将引发错误

  

EXECUTE之后的事务计数表明BEGIN和COMMIT语句的数量不匹配。上一个计数= 0,当前计数= 1

我尝试了TSQL Try / Catch within Transaction or vice versa?的套用解决方案,但仍然出现相同的错误。

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 :(得分:2)

由于您当前的设置不允许您进行COMMIT交易,因此您需要向COMMIT块添加TRY并移动{{1 }}到ROLLBACK块。如下所示。再次,请阅读Erland's lengthy blog的错误处理信息,以寻求更好的方法和应添加的其他内容,例如CATCH

SET XACT_ABORT ON