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

it2022-05-09  27

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