zoukankan      html  css  js  c++  java
  • @@ERROR

    @@ERROR   

    当前一个语句遇到错误,则返回错误号,否则返回0。需要注意的是@ERROR在每一条语句执行后会被立刻重置,因此应该在要验证的语句执行后检查数值或者是将它保存到局部变量中以备将来使用。具体的分析请看下面的代码,一目了然。

    If EXISTS(SELECT * FROM SYSOBJECTS WHERE ID=OBJECT_ID(N'TB') AND XTYPE='U')
    Drop Table TB
    CREATE TABLE TB(ID INT PRIMARY KEY,NAME VARCHAR(100))
    -------------------------------出现错误,打印出错误编号
    Insert Into TB Select  1,'JACK'
    Print '错误编号:'+CAST(@@ERROR AS VARCHAR(10))
    print @@error

    执行结果为:

    具体实例说明:

    ---------------------更新测试数据,利用事务处理
    BEGIN TRANSACTION T
    
    UPDATE TB
    SET NAME='JACK已更新'
    WHERE NAME='JACK'
    
    RAISERROR ('不好意思,你没有权限!',11,1)
    print '第一次打印的错误编号是:'+cast(@@error as varchar(10))
    
    SELECT '执行一条命令'
    
    print @@error
    print '第二次打印的错误编号是:'+cast(@@error as varchar(10)) 
    
    ------------------------------------进行判断,是否需要回滚事务
     if(@@error<>0)
        rollback TRANSACTION T
     else 
        commit  TRANSACTION T
        -------------------------查看结果
    select  * from TB
    查询结果:
    
    

    按照常理来说,上面的SQL块是需要进行回滚的,数据应该是没有被更新的,但是就因为在出现错误后执行命令了,使得@@error的值变成了0,故程序块更新了表数据,而没有进行回滚。

     上述问题的解决办法:

    ---------------------更新测试数据,利用事务处理
    declare @@error_num int
       BEGIN TRANSACTION T
            -------------------------------变量赋初始值
            set @@error_num=0
    
            UPDATE TB
            SET NAME='JACK已更新'
            WHERE NAME='JACK'
            set @@error_num=@@error_num+@@ERROR
            print @@error_num
    
            RAISERROR ('不好意思,你没有权限!',11,1)
            set @@error_num=@@error_num+@@ERROR
            print '第一次打印的错误编号是:'+cast(@@error_num as varchar(10))
    
            SELECT '执行一条命令'
            set @@error_num=@@error_num+@@ERROR
    
            print @@error
            print '第二次打印的错误编号是:'+cast(@@error_num as varchar(10)) 
    
            ------------------------------------进行判断,是否需要回滚事务
             if(@@error_num<>0)
                rollback TRANSACTION T
             else 
                commit  TRANSACTION T
                -------------------------查看结果
            select  * from TB
    执行结果如下:
    
    

     

  • 相关阅读:
    Blazor使用Chrome远程调试
    Blazor登录Ids4
    Jenkins + Coding 构建 Docker Image 并自动上传至Docker Registry
    EFK 数据生命周期
    EFK (Elasticsearch + Fluentd + Kibana) 日志分析系统
    通过Nginx代理Grafana,并通过域名访问
    Prometheus搜集mysql和nginx log指标
    java 线程相关(4)
    java 并发相关(5)
    java 线程相关(3)
  • 原文地址:https://www.cnblogs.com/OliverQin/p/5073529.html
Copyright © 2011-2022 走看看