1.@@error函数,在一个事务中会累加吗
例如:
begin tranupdate a set a='xx' where b=3
update a set a='xx1' where b=4if @error <> 0
rollback 
else 
commit里面有2条语句,@error检测的是第二条的错误还是第一条 还是他们2个都检测后的累加?2.mssql的报错信息,执行的时候有的错误虽然产生了,但是不会中断,会继续执行下面的代码,有的则不是,直接中断,什么样的错误会中断,哪里可以查得到。存储过程中的错误呢是否中断是根据什么判断的?

解决方案 »

  1.   

    ---------事例:
    declare @i int,@j int,@result int
    select @i=1,@j=0
    set @result=@i/@j
    print @@error--此处的@@error是计算结果:8134
    print @@error--此处是执行上一个print @@error是否有错,所以结果为0
      

  2.   

    实际测试了一下 事务中 也是一样 但是网上有这么一贴,,
    http://www.cnblogs.com/zhuifengnianshao/archive/2010/11/24/1886939.html
    不知道对不对
      

  3.   


    --我已经看了,那个例子我敢保证是错的,如果你有多条sql操作语句的话,你一定要定义一个变量,在每次执--行完成以后,@err=@err+@@error,这样你才判断@err<>0才能保证事务的回滚。
      

  4.   


    begin tran
    declare @err int
    set @err=0
    update a set a='xx' where b=3
    set @err=@err+@@error
    update a set a='xx1' where b=4
    set @err=@err+@@error
    if @err <> 0
    rollback  
    else  
    commit
      

  5.   

    返回执行的上一个 Transact-SQL 语句的错误号。 Transact-SQL 语法约定语法
     
    @@ERROR
     返回类型
    integer备注
    如果前一个 Transact-SQL 语句执行没有错误,则返回 0。内容来自联机丛书,楼主看一下吧。@@error是怎么定义的
      

  6.   

    其实我也知道@@error是返回上一行的错误,但是没办法看到了这种文章,心里没底了。。故此确认一下,那么第二个问题呢。
      

  7.   

    第二个问题是根据你的语句的错误的严重性,
    比如alter和select操作错误的严重性不一样
    一般情况一堆alter 操作中只要有一条语句出错,之后的就不会执行而select操作就会还有就是你可以用transaction 和 try catch来控制这些语句,避免出错后还执行之后的操作
      

  8.   


    --用transaction 和 try catch来控制这些语句,避免出错后还执行之后的操作 正确--但是并不是select出现错误后面的不执行了。
    --:sql的最小执行单元应该是1个批处理。
     
      

  9.   


    ------------------1------------------
    select * from abc
    select * from #t1
    ---------------------
    abc 不存在的情况,执行结果如下:消息 208,级别 16,状态 1,第 1 行
    对象名  'abc' 无效。

    ------------------2------------------
    select * from abc
    go
    select * from #t1----------------执行结果如下:消息 208,级别 16,状态 1,第 1 行
    对象名  'abc' 无效。(5 行受影响)