zoukankan      html  css  js  c++  java
  • sql 关于dblink和多条update、insert事务回滚写法

    在存储过程的编写中难免会遇到调用同库他人的proc和跨库调用proc,还有一个proc中有多条对多表进行写入和修改的语句。那么就会用到tran。

    如果我们在不写try的情况下就要对每个insert,update的后面写上

    IF @@error <> 0
                    OR @@Rowcount = 0
                    BEGIN
                        ROLLBACK TRAN 
                    END    

    来确保所有语句的正常执行和有影响的行数。

    而在写了try的情况下,我们就可规范一下写法,利用RAISERROR

    DECLARE @Ret_Msg VARCHAR(200)
    DECLARE @Ret_Msg1 VARCHAR(200)
    DECLARE @nResult INT
    DECLARE @vcResult VARCHAR(200)
    BEGIN TRY
            BEGIN TRAN
                   UPDATE Table_a set a=1 WHERE b =1
                   IF @@Rowcount = 0
                   BEGIN
                        SET @Ret_Msg = '执行失败'
                        SET @Ret_Msg1 = 'Table_a 更新失败'
                        RAISERROR(@Ret_Msg1,16,1)
                   END
                   数据库.架构.proc 1,2, @nResult OUT, @vcResult OUT
                   IF @nResult <0
                   BEGIN
                        SET @Ret_Msg = @vcResult
                        SET @Ret_Msg1 = 'dbLink调用失败' + @vcResult
                        RAISERROR(@Ret_Msg1,16,1)
                   END
                   SELECT @Ret_Msg  as vcResult 
            COMMIT TRAN
    END TRY
    BEGIN CATCH
        IF @@tranCount > 0
                    ROLLBACK TRAN;
        SELECT  @Ret_Msg AS vcResult 
    END CATCH             

    当结果不是我们想要的就RAISERROR抛个错误,让CATCH处理

  • 相关阅读:
    HZOJ 太阳神
    HZOJ Silhouette
    HZOJ Dash Speed
    HZOJ 巨神兵
    值得纪念的cspsAFO总结
    11月FLAG
    模板易错总结
    树 总结
    DP总结(优化等)
    代码低级错误总结
  • 原文地址:https://www.cnblogs.com/ghelement/p/5387375.html
Copyright © 2011-2022 走看看