码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server @@ERROR的小误区大Bug

时间:2018-09-26 01:09:23      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:val   raise   server   value   nbsp   计数   误区   ack   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

标签:val   raise   server   value   nbsp   计数   误区   ack   bug   

原文地址:https://www.cnblogs.com/xuannian/p/9700119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!