mssql sqlserver 深入理解@@error 变量-避免@@error误区


摘要:
下文讲述sqlserver中@@error变量的详细说明,如下所示:
实验环境:sql server 2008 R2



@@error 变量简介

@@error 是一个系统变量
@@error 返回当前执行语句的执行状态,当@@error 等于0时,代表sql语句执行成功,不等于0则代表sql执行失败
@@error 是一个动态计数器,它是一个系统变量,不能进行相关加减操作

@@error 常见写法

    if  (@@error <>0)
      begin 
          rollback tran; 
      end
    else
      begin
         commit tran; 
     end


@@error 误区

SET NOCOUNT ON;
 BEGIN tran 

UPDATE [maomao365.com]
SET info='测试信息'
WHERE  keyId =100

RAISERROR ('抛出错误!',16,1)

SELECT newId()

if(@@error<>0)
 begin
    ROLLBACK tran 
end
else
begin
    COMMIT  tran
end 
set nocount on 


以上的sql脚本 RAISERROR (‘抛出错误!’,16,1) 抛出sql错误,理论上@@error变量应该不等于0,但是当@@error判断时,数据还是被提交,那么为什么会出现这样的情况呢?
主要原因是:
RAISERROR抛出错误脚本运行后,@@error变为5000,但是当运行
select newid()后,因为sql脚本执行成功,@@error变量为0
最后if 判断时,@@error已经为0了,所以数据还是会被提交。
—处理方法:
方法1:使用try catch 语法对sql脚本进行包裹
方法2:在脚本运行后,及时对sql脚本进行判断

  ---方法1:
SET NOCOUNT ON;
BEGIN TRY
 BEGIN TRANSACTION 

UPDATE [maomao365.com]
SET info='测试信息'
WHERE  keyId =100

RAISERROR ('抛出错误!',16,1)

 SELECT newId()

COMMIT TRANSACTION
END TRY

BEGIN CATCH
    DECLARE @msg nvarchar(1000)=ERROR_MESSAGE()    --将错误信息放入@msg变量中              
    RAISERROR (@msg,16,1)   
    ROLLBACK TRANSACTION T ----回滚脚本
END CATCH
set nocount on 
go

 ---方法2:

SET NOCOUNT ON;
 BEGIN tran 
UPDATE [maomao365.com]
SET info='测试信息'
WHERE  keyId =100

RAISERROR ('抛出错误!',16,1)
if(@@error<>0)
 begin
    ROLLBACK tran  
   return;
end

SELECT newId()
if(@@error<>0)
 begin
    ROLLBACK tran 
end
else
begin
    COMMIT  tran
end 
set nocount on