sql中的@@error并不是全局的、系统的

    今天正好做一个存储过程,用到了事务, 里面有三个sql语句 ,最后用 @@error 是否等于0 来判断事务中有没有错误。测试的时候 发现其中的一个sql语句有错,但另外 两个sql语句却执行成功,很郁闷,最后输出 @@error 竟然为0,明明中间有错,最后输出确是 0 。找了很多资料,后来发现了一直没注意的一句话 :

备注
如果前一个 Transact-SQL 语句执行没有错误,则返回 0。

如果前一个语句遇到错误,则返回错误号。如果错误是 sys.messages 目录视图中的错误之一,则 @@ERROR 将包含 sys.messages.message_id 列中表示该错误的值。

由于 @@ERROR 在每一条语句执行后被清除并且重置,因此应在语句验证后立即查看它,或将其保存到一个局部变量中以备以后查看。

终于发现原来@@error 只是针对前一个语句有错误的时候后,才会返回错误号,它并不是全局的,系统的。 我现在做的时候是:先申明一个变量, 每个sql语句后面把 @@ERROR 的值累加给变量,最后统一判断总的error值是否为0 ,不然就回滚   

部分代码:

alter procedure sp_InsertTravelAsk
(
...........
)
as
begin
declare @AskID int
declare @allError int ---申明一个总的错误
begin transaction AddTravelAsk
   insert into ask(DepartmentID,MemberID,ClinetName,Contact,AskSource,type)
    values(@DepartmentID,@MemberID,@ClinetName,@Contact,@AskSource,@Type)
   set @allError=@@error --把错误累加
   set @AskID =@@identity

   insert into TravelAsk(TravelAskID,AskID,LineTypesID,AdultNumber,ChildNumber,DepartureTime,BackTime,TravelSites)
    values (@TravelAskID,@AskID,@LineTypesID,@AdultNumber,@ChildNumber,@DepartureTime,@BackTime,@TravelSites)

   set @allError=@allError+ @@error   --把错误累加

   insert into TravelAskQuestion(TravelAskQuestionID,AskID,DepartmentID,MemberID,Content)
    values (@TravelAskQuestionID,@AskID,@DepartmentID,@MemberID,@Content)

   set @allError=@allError+ @@error--把错误累加

if @allError<>0 ---最后判断总错误
   rollback transaction AddTravelAsk
    else
    commit tran

end

转载于:https://www.cnblogs.com/n666/archive/2010/07/20/2190905.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值