CREATE PROCEDURE grade_subj_rate
@exchrate float,
@grades float
AS
declare @proid  int 
declare @old_class  int
declare @new_class  int
declare @add_class  int
declare @add_subjun  float
declare @old_subjun float
declare @new_subjun float
declare @old_grade float
declare @new_grade float
declare @SQL nvarchar (2000)
declare @re int out  -- 定义为输出参数set @re=0
set xact_abort on --加上这句
begin trandeclare tb cursor local for
SELECT id, grade,subjunctive,mem_class  
FROM member   WHERE grade>@grades
open tb
fetch next from tb into @proid,@old_grade,@old_subjun,@old_class
    while @@fetch_status=0
       begin
            set @add_class=@old_grade/@grades   ---这里,我错传 了一个数字0导致有被0除的错误发生,然后,事务并没有终止,反而继续执行,把我的更新的几个字段设置成了null值
           set @new_class=@old_class+@add_class 
                if @new_class>4 
                set @new_class=4
           set @new_grade=20+@old_grade-@add_class*1000
           set @new_subjun=@old_subjun+(@grades*@add_class*@exchrate)
            update member set mem_class=@new_class,grade=@grades,subjunctive=@exchrate where id=@proid
  fetch next from tb into @proid,@old_grade,@old_subjun,@old_class
      end
close tbset @re=1   --改成这样
commit tran
return(@re) 
GO

解决方案 »

  1.   

    @@ERROR
    返回最后执行的 Transact-SQL 语句的错误代码。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ^^^^^^^
      

  2.   

    用sql寫語句時,若出現 a/b的情況,一定要做b不能為0的處理,有兩種方式:select a/nullif(b,0)
    select a/case when b=0 then null else 0 end事務中可用:
    SET XACT_ABORT ON
    当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚或用你的方法,使用if @@error<>0   處理應放在每個編輯語句後,出錯就回滾
      

  3.   

    progress99(如履薄冰) 您好,
    select a/nullif(b,0) 这里我 用下面的语句 试验了一下,出现的问题就是
    首先,我使用了
     set xact_abort on 
    接着
    set @grades=0
    set @addclass=@old_grade/nullif(@grades,0)返回
    set @re=1    
    commit tran
    return(@re) 
    GO结果我返回了1,也就是处理正常的提示,但是查看我的数据库,我发现,相应的记录都变成了null
    这不是我想要的结果啊,
    我想要得就是,无论出现那种错误情况,只要出错,就提示不对,然后不执行~ zjcxc(: 邹建 :) 使用您的哪个语句,运行的没有问题,事务终止了,但是没有返回值,只是给了一个提示是:出现了被零除的情况,这个能否返回值呢,是不是只要一回滚,就不能返回值了吗,我想返回值,但是也想要这个错误提示!就是类似于 弹出一个对话框,出现错误,原因如下:是不是太贪心了啊,呵呵,
      

  4.   

    还有,我的一个存储过程,  
    我把哪个@uid设置为0 执行下面的一句:
    set @re=0
    set xact_abort on 
    update member  set subjunctive=@new_subjunctives  where id=@uid
    没有出错,是不是,这种情况不会导致出错呢
    那么,怎么才算是出错呢,一个是被0除,一个是自己定义,那么这个set xact_abort 监视的是什么样的错误呢
      

  5.   

    set @grades=0
    set @addclass=@old_grade/nullif(@grades,0)nullif函數將當@grades為0時,nullif(@grades,0)返回NULL,如果你不希望結果為NULL,
    還需用isnull()函數處理:
    set @addclass=isnull(@old_grade/nullif(@grades,0),0)set xact_abort on 隻保証出錯就回滾