博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server 中关于@@ERROR的一个小误区()
阅读量:4042 次
发布时间:2019-05-24

本文共 1063 字,大约阅读时间需要 3 分钟。

Sql Server 中关于@@ERROR的一个小误区

            
             
                                            
   我们经常写存储过程的时候会用到@@ERROR来判断执行是否成功,下面举例说明,

    DECLARE @NowTime DATETIME;      

    BEGIN TRAN         RAISERROR ('假设这里抛出异常!',16,1);  

      SET @NowTime=GETDATE();    

    IF ( @@ERROR <> 0 )        

    BEGIN                 SELECT ERROR_MESSAGE() Result;          

      ROLLBACK TRAN       

      END    

    ELSE          

     SELECT  'Success' Result;      

  COMMIT TRAN

例如上面的语句中,我在执行获取当前时间之前,抛出了一个异常,那么按照我们想要的它应该回滚当前事务,输出ERROR_MESSAGE()错误信息,可实际上执行的结果是“Success”,看到这里不由的想到另一个与之类似的默认的参数,@@IDENTITY,这个可以返回sql执行最后依次的标识值,我们知道如果@@IDENTITY不紧跟你最后的sql语句的时候,那么你无法获取想要的结果,这里的@@ERROR也是类似的,所以原因就很明显了,我抛出异常后,下面接着执行的是 SET @NowTime=GETDATE(); 这条语句是没有错误的,所以最终@@ERROR始终是0,所以最后事务还是提交了,另外注意下@@ERROR并不是获取的错误的次数,而是有一定含义的错误码。
那么这种情况该如何解决呢,很简单,TRY  CATCH ,真的是很久不写存储过程了,忽略了这一点,当其中一条语句出现异常时,立马抛出异常并接收异常,回滚事务就可以了,作出如下修改:
        DECLARE @NowTime DATETIME;      

    BEGIN TRY      

   BEGIN TRAN   

     RAISERROR ('假设这里抛出异常!',16,1);      

  SET @NowTime=GETDATE();       

 COMMIT TRAN;              

 SELECT  'Success' Result;   

     END TRY      

   BEGIN CATCH       

 SELECT @@ERROR Error;         

       SELECT ERROR_MESSAGE()  Result;          

     ROLLBACK TRAN     

    END CATCH执行结果如下:

所以记住,以后再写复杂的存储过程或者用到事务的时候最好加上TRY CATCH 。

————————————————
原文链接:https://blog.csdn.net/u010584641/article/details/77145915

你可能感兴趣的文章
linux和windows内存布局验证
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux dump_backtrace
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
Flex 中的元数据标签
查看>>