想aaa或bbb插入错误时,不再进行插入,应如何写这段代码。  

解决方案 »

  1.   

    CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int)
    AS
    begin
      SET XACT_ABORT ON
      GO
      begin transaction
    insert into aaa(aaa) values(@aaa)
    insert into bbb(bbb) values(@bbb)
      commit transaction
    end
    GO
    --执行SET XACT_ABORT ON之后,事务才会执行回滚
      

  2.   

    CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int)
     AS
    begin transaction
    insert into aaa(aaa) values(@aaa)
    if @@error<>0 goto lb_err
    insert into bbb(bbb) values(@bbb)
    if @@error<>0 goto lb_err
    commit transaction
    returnlb_err:
    rollback tran
    GO
      

  3.   

    用 SET XACT_ABORT ON ,是有错误时自己停止并回滚事务,而不是:事务才会执行回滚
      

  4.   

    to lyl77 (lyl77):
    每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
    对于你的代码
    CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int)
     AS
    begin transaction
    insert into aaa(aaa) values(@aaa)
    insert into bbb(bbb) values(@bbb)
    if @@error=0 commit tran
    else
       rollback tran
    GO
    --如果insert into aaa(aaa) values(@aaa)出错(这个时候@@error<>0),insert into bbb
    (bbb) values(@bbb)正确(这个时候@@error=0)
    =>依然不能执行rollback tran
      

  5.   

    to zjcxc(邹建):
    谢谢,是的,应该更严谨一点的
      

  6.   

    按照邹建的思路,是不是在事务中有多少个操作就用多少个判断的语句,这样是不是太麻烦了一点
    SQL里面有没有这样的设置,当事务中有一个错误时,事务中已完成的操作都要回