set xact_abort on
begin tran
update sc0 set lsj=10
insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
commit tran
set xact_abort on
begin tran
update sc0 set lsj=10
exec ('insert into zsp(flno1) values('+''''+'tttttt'+''''+')')
commit tran

解决方案 »

  1.   

    begin tran
    declare @err1 int,@err2 int
    update sc0 set lsj=10
    set @err1=@@error
    insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
    set @err1=@@error
    if @err1=0 and @err2=0
    commit TRANSACTION
    else
    ROLLBACK TRANSACTION
      

  2.   

    谢谢 vivianfdlpw()和  wgsasd311(自强不息)!!
    在前面加了这个语句set xact_abort on 对于第一个批处理
    begin tran
    update sc0 set lsj=10
    insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
    commit tran
    可以回滚,但是对于第二个批处理
    set xact_abort on
    begin tran
    update sc0 set lsj=10
    exec ('insert into zsp(flno1) values('+''''+'tttttt'+''''+')')
    commit tran
    还是没有回滚呀是不是‘exec’ 的问题呀?
      

  3.   

    create table A
    (
      ID int check(ID=2)
    )set xact_abort on
    begin tran
    exec('insert A select 1')
    commit tran--查看
    select * from A--删除测试环境
    drop table A--结果
    /*
    ID          
    ----------- (所影响的行数为 0 行)
    */
      

  4.   

    但是如果这样写呢?
    create table A
    (
      ID int,
      mc varchar(1000) )create table b(id int)set xact_abort on
    begin tran
    insert into b select 1
    exec('insert A(i) select 1')
    commit tran
    select * from b
    应该表b中没有数据显示,但是他有!!
    我不知道为什么?你可以试一下!!!多谢您的指点!!!
      

  5.   

    exec('insert a(i) select 1) 我故意写成a(i)以便造成插入时的错误!!!!
      

  6.   

    看看SQL的帮助:
    如果批处理中出现运行时语句错误(如违反约束),那么 SQL Server 中默认的行为将是只回滚产生该错误的语句。可以使用 SET XACT_ABORT 语句改变该行为。在 SET XACT_ABORT ON 语句执行之后,任何运行时语句错误都将导致当前事务自动回滚。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
    你出错的语句是属于语法错误自然不受SET XACT_ABORT 的影响,所以SQL不会自动回滚事务
    要明白为什么叫Transact SQL 即每句都是事务
      

  7.   

    谢谢大家的帮助!但是如果真像qhqh310(qh)的那样那第一个也不应该回滚了,是吧?!