begin traninsert into testname (tname) values (@name)
while (...)
begin
set @sql = '....'
exec(@sql)
endif @@error<>0
rollback tran
else
commit tran
以上是部分代码,我想问的就是,当while内部的exec(@sql)出错后,为什么第一个insert还是执行成功了?我想实现的效果是,如果while内部的exec出错,则整个事务都回滚,请问应该如何修改?谢谢

解决方案 »

  1.   

    set xact_abort on
    begin tran
    insert into testname (tname) values (@name)
    while (...)
    begin
    set @sql = '....'
    exec(@sql)
    endif @@error<>0
    rollback tran
    else
    commit tran
      

  2.   

    将SET XACT_ABORT ON 设置为开
      

  3.   

    当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。
      

  4.   

    begin try 
    begin tran
    insert into testname (tname) values (@name)
    while (...)
    begin
    set @sql = '....'
    exec(@sql)
    end
    commit tran
    end try
    begin catch
    rollback
    end catch
      

  5.   


    我试过了,不行啊,第一个insert还是插入了,但执行while里的语句报如下的错误:服务器: 消息 207,级别 16,状态 1,行 1
    列名 'tid' 无效。