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
@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
返回最后执行的 Transact-SQL 语句的错误代码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
^^^^^^^
select a/case when b=0 then null else 0 end事務中可用:
SET XACT_ABORT ON
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚或用你的方法,使用if @@error<>0 處理應放在每個編輯語句後,出錯就回滾
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(: 邹建 :) 使用您的哪个语句,运行的没有问题,事务终止了,但是没有返回值,只是给了一个提示是:出现了被零除的情况,这个能否返回值呢,是不是只要一回滚,就不能返回值了吗,我想返回值,但是也想要这个错误提示!就是类似于 弹出一个对话框,出现错误,原因如下:是不是太贪心了啊,呵呵,
我把哪个@uid设置为0 执行下面的一句:
set @re=0
set xact_abort on
update member set subjunctive=@new_subjunctives where id=@uid
没有出错,是不是,这种情况不会导致出错呢
那么,怎么才算是出错呢,一个是被0除,一个是自己定义,那么这个set xact_abort 监视的是什么样的错误呢
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 隻保証出錯就回滾