您好,我是一名入门级别的学生,想咨询各位大神一下数据库中的问题,比如 我在一个事务中有操作游标,结构如下
begin try
   begin tran
      某某操作(有使用游标);
  commit tran
end try
begin catch
   if(@@trancount>0) rollback tran;
end  catch
我想咨询的是,
1、我上面的这样写法是不是比较普遍,没有什么问题吧?不会让别人感觉到我写的这个很奇怪把?
2、游标中的@@fetch_status值不为0的时候会不会抛出异常到catch中从而导致事务回滚?
    好像@@fetch_status值不为0的时候不会抛出异常到catch中,我之所以这样猜测是因为
一个游标建立之后,fetch next 读到最后一行之后肯定读不到了,导致@@fetch_status不为0,
但是这个情况是正常的,不应该抛出异常,那什么值的时候会抛出异常呢?
求各位高手给予小妹一点指导  谢谢

解决方案 »

  1.   

    1、有这样的写法,但是不推荐。游标的使用建议还是多了解后,慎用! 性能影响比较大。
    2、    SELECT  *   FROM    sys.messages   这个里面存在的均可触发异常处理。无需特别的控制,try里面会检测的。 @@fetch_status不为0 的情况,需要lz判断处理。这仅仅是一个结果性错误,而非语法或逻辑错误。
      

  2.   

    declare @i int
    set @i=2;
    begin try
       begin tran
        set @i=1;
        RAISERROR ('不允许插入重复的配件', 16, 1)WITH NOWAIT ;
       commit tran
    end try
    begin catch
    rollback tran;
    end catch
    print @i为何@i是1 不是2???求解
      

  3.   


    declare @i int
    set @i=2;
    begin try
       begin tran
        set @i=1;
        RAISERROR ('不允许插入重复的配件', 16, 1)WITH NOWAIT ;
       commit tran
    end try
    begin catch
    rollback tran;
    end catch
    print @i为何@i是1 不是2???求解 
      

  4.   

    RAISERROR确实发生了作用,并执行了rollback,但是你并没有执行数据操作,而只是对变量进行操作,事务回滚是因为记录了事务日志,是对数据库结构及数据改动的记录,很显然事务日志没有必要去记录一个变量的创建于改动,你把变量换成update语句就可以看到效果了还有,try catch也不是什么错误都能处理,具体你可以看看联机丛书