CREATE PROCEDURE A AS
begin
  declare @error int
  set @error = 0
  begin tran
    exec B
    insert into student1(班级号,姓名) values ('001','王五')
    set @error = @error + @@error
  if @error = 0
    commit tran
  else
    rollback tran
end
GO
CREATE PROCEDURE B AS
begin
  declare @error int
  set @error = 0
  begin tran
    insert into student1(班级号,姓名) values ('002','张三')
    set @error = @error + @@error
  if @error = 0
    commit tran
  else
    rollback tran
end
GO假设 [student1] 表里面已经有 001 王五  002 张三,这两条记录
执行语句 Exec A
结果是,如果 B 出错的话,那么 '001','王五' 这句话还是会执行
我想实现如果 B 出错,后面就不执行了,就是说能保证一个事物

解决方案 »

  1.   

    SET XACT_ABORT  ON 不过你的@@ERROR返回的值不准,所以导致这样begin tran
    insert into student1(班级号,姓名) values ('001','王五')
    exec B
    换个位置就行了
      

  2.   

    1.最好是对tran加上名字, A里的begin tran trA ...
    2.@@error对的只是上一操作的返回error。
    3.如果要B回滚后,A的下面就不操作,最好是在B里返回一个参数给A,然后A里在exec B后去判断,是否要往下。
      

  3.   

    1 楼的,确实好用啊,SET XACT_ABORT ON
    3 楼说的还要写东西,可惜我不会写,返回 @@error 的值,还真不会SQL77,那我写完了 SET XACT_ABORT ON,还用在存储过程最后写 SET XACT_ABORT OFF 吗?
    对 SQLServer2000 中,其他的会不会有影响
      

  4.   

    有错当然要回滚了,这样做比较合理啊,谢谢 SQL77 啊,结贴了