SQL Server @@ERROR的小误区大Bug
Posted 温柔的悬念。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server @@ERROR的小误区大Bug相关的知识,希望对你有一定的参考价值。
在公司项目中看到有这样使用事务的:
-- 开启事务 BEGIN TRAN INSERT TABLE1(ID) VALUES (1) INSERT TABLE2(ID) VALUES (2) UPDATE TABLE3 SET ID=3 IF @@ERROR > 0 BEGIN ROLLBACK TRAN RETURN 1003 END COMMIT TRAN
乍一看没啥问题,仔细思考就能发现有很大的问题。
@@ERROR:并不是错误的计数器,而是没执行一条SQL语句就会产生一个新的@@ERROR。
那有人就会觉得那只有一条增删改的时候就可以这么用。
是可以,但是还是要谨慎。下面也是在公司项目中看到的错误例子:
-- 开启事务 BEGIN TRAN INSERT TABLE1(ID) VALUES (1) SET @New_ID = SCOPE_IDENTITY()
IF @@ERROR > 0 BEGIN ROLLBACK TRAN RETURN 1003 END COMMIT TRAN
所以这种写法有很大的问题,这种问题就导致数据错乱。
正确使用事务:
BEGIN TRY -- 这里没有Try也是可以的 SET XACT_ABORT ON; -- 执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚 BEGIN TRAN INSERT INTO TABLE1 SELECT 1 INSERT INTO TABLE2 SELECT 2 UPDATE TABLE3 Set ID = 3 COMMIT TRANEND TRY BEGIN CATCH RAISERROR (‘修改异常!‘,16,1) --抛出异常 END CATCH
以上是关于SQL Server @@ERROR的小误区大Bug的主要内容,如果未能解决你的问题,请参考以下文章