SQL Server使用常见误区

情景重现

案例一

IF没有添加BEGIN END,直接RETURN

例如以下语句

...
IF XXX 
do sth.
RETURN 
...

这个语句看似简单,但是运行会发现,运行结果不是你预想的那样。

本来我们的意图是想判断某一个条件,如果符合,就停止运行。

但是执行之后你会发现,无论IF真假与否,RETURN都会执行。

解决方案

因此需要加上BEGIN END来控制。

正确的写法

...
IF XXX 
    BEGIN 
        do sth.
        RETURN 
    END
...

错误原因

一般IF后面有很多语句时候,我们会记住用BEGIN END,但因为一条语句,可以忽略,有时候就忘了加。

因此,最好的办法是每一个IF后面都加上BEGIN END。

案例二

在事务未提交之前试图通过return回滚

错误写法

...
begin transaction
   IF XXX
      BEGIN
         do sth.
      END
   ELSE
      BEGIN
         RETURN--错误
      END
rollback 
commit             
...

分析

如果BEGIN一个TRAN以后直接RETURN,事务会不会回滚?

开启了事务,必须在RETURN之前回滚或者提交事务, SQL SERVER不会自动帮你处理这个。

正确写法

...
begin transaction
   IF XXX
      BEGIN
         do sth.
      END
   ELSE
   BEGIN
      rollback
   END 
commit             
...

延伸

在C#中,如果没有使用连接池,则事务在连接断开和销毁时被强制回滚,如果使用连接池,则事务在连接被再次使用时调用的exec sp_reset_connection存储过程清理掉。如果该连接没有被再次使用或删除,则事务一直存在,便会一直锁住相关资源不释放,照常日志变大,镜像和复制异常等情况。

参考

http://www.cnblogs.com/TeyGao/p/3522965.html

未完待续

文章来自笔者博客,使用Markdown编辑发布,原文地址:SQL Server使用常见误区

你可能感兴趣的:(SQL Server)