hao_2468

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

    今天正好做一个存储过程,用到了事务, 里面有三个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

posted on 2010-07-20 10:49  hao_2468  阅读(165)  评论(0编辑  收藏  举报