@@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
执行结果如下:
