[转载]SQLSERVER 不能在 INSERT-EXEC 语句内部使用 ROLLBACK 语句

转自http://blog.csdn.net/zhang_bamboo/article/details/6024790
两个存储过程test1和test2,在TEST1的事务里面调用TEST2(EXEC TEST2),TEST2里面也有事务,当TEST2里面的事务执行ROLLBACK时,就会报错
“消息 3915,级别 16,状态 0,过程 IMS_TJZZJYJEQ1,第 100 行,不能在 INSERT-EXEC 语句内部使用 ROLLBACK 语句。”,
原因是运行到存储过程TEST2时,有两个事务,当执行ROLLBACK时就会出错,因为TEST2是通过EXEC的方式执行的。

CREATE PROC p1
AS
    -- 初始化事务和返回值设置
    DECLARE
        @Trancount int,
        @re int
    SELECT
        @re = 0,
        @Trancount = @@ROWCOUNT
    
    -- 如果外层(调用者)无事务, 则直接开启事务, 否则保存事务点(这样后面可以根据情况做事务处理)
    IF @Trancount = 0
        BEGIN TRAN
    ELSE
        SAVE TRAN TRAN_Save_Point

    ---.... 你的处理
    -- 在可能出错的语句后面应该包括类似这样的错误处理语句
    IF @@ERROR <> 0
        GOTO lb_Error


-- 成功提交事务
lb_Succeed:    
    IF @Trancount = 0
        COMMIT TRAN
    GOTO lb_Return

-- 失败回滚事务
lb_Error:
    IF @Trancount = 0
        ROLLBACK TRAN
    ELSE
        ROLLBACK TRAN TRAN_Save_Point
    SET @re = -1

-- 退出处理
lb_Return:
    RETURN @re

posted @ 2017-08-08 08:51  ne_lucifer  阅读(611)  评论(0)    收藏  举报