mssql sqlserver 正确使用@@error


摘要:
下文讲述在sql脚本编写时,我们应注意@@error的相关写法避免出现bug


在sql脚本编写中,我们常常使用@@error判断存储过程是否执行成功
例:

     DECLARE @a int; 
     BEGIN TRAN
      RAISERROR ('抛出异常-模拟错误',16,1);
     SET @a=99;
       IF  @@ERROR  <> 0 
             BEGIN
                 SELECT ERROR_MESSAGE() [错误信息];
                 ROLLBACK TRAN
             END 
        ELSE
             BEGIN
                SELECT  '执行成功'
                COMMIT TRAN
            END

以上语句,当我们模拟错误时,并通过一个@@error 判断错误数,并输出错误信息和回滚事务 ,但脚本返回的却是”执行成功”,此时我们通过仔细的分析脚本,发现在抛出错误后,增加了一句set @a =99 这条赋值命令一切运行正常,导致@@error的结果为0,所以事务得到正确的提交,即在使用@@error进行相关错误判断时,一定要在sql执行后立即进行相关判断。
————————————————————————————-
在sqlserver 2005以后的版本中,微软开放了try catch 的捕捉异常的方法,我们可以在脚本中采用 try catch的方式捕捉异常,可避免@@error写错位置导致的异常,如下:

DECLARE @a int; 
    BEGIN TRY 
     BEGIN TRAN
      RAISERROR ('抛出异常-模拟错误',16,1);
     SET @a=99;
     SELECT  '执行成功'
                COMMIT TRAN
    END TRY
    BEGIN CATCH 
                 SELECT ERROR_MESSAGE() [错误信息];
                 ROLLBACK TRAN
    END  CATCH

采用以上的方法编写脚本时,当try 中的脚本,运行异常时,会立即进入catch中进行相关运行。

注意事项:
@@error 只可判断前一条sql脚本是否执行正确。