例如以下語句
...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--錯誤 ENDrollback 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使用常見誤區
新聞熱點
疑難解答