例如以下語(yǔ)句
...IF XXX do sth.RETURN ...
這個(gè)語(yǔ)句看似簡(jiǎn)單,但是運(yùn)行會(huì)發(fā)現(xiàn),運(yùn)行結(jié)果不是你預(yù)想的那樣。
本來(lái)我們的意圖是想判斷某一個(gè)條件,如果符合,就停止運(yùn)行。
但是執(zhí)行之后你會(huì)發(fā)現(xiàn),無(wú)論IF真假與否,RETURN都會(huì)執(zhí)行。
解決方案
因此需要加上BEGIN END來(lái)控制。
正確的寫法
...IF XXX BEGIN do sth. RETURN END...
錯(cuò)誤原因
一般IF后面有很多語(yǔ)句時(shí)候,我們會(huì)記住用BEGIN END,但因?yàn)橐粭l語(yǔ)句,可以忽略,有時(shí)候就忘了加。
因此,最好的辦法是每一個(gè)IF后面都加上BEGIN END。
案例二在事務(wù)未提交之前試圖通過(guò)return回滾錯(cuò)誤寫法
...begin transaction IF XXX BEGIN do sth. END ELSE BEGIN RETURN--錯(cuò)誤 ENDrollback commit ...
分析
如果BEGIN一個(gè)TRAN以后直接RETURN,事務(wù)會(huì)不會(huì)回滾?
開(kāi)啟了事務(wù),必須在RETURN之前回滾或者提交事務(wù), SQL SERVER不會(huì)自動(dòng)幫你處理這個(gè)。
正確寫法
...begin transaction IF XXX BEGIN do sth. END ELSE BEGIN rollback END commit ...
延伸
在C#中,如果沒(méi)有使用連接池,則事務(wù)在連接斷開(kāi)和銷毀時(shí)被強(qiáng)制回滾,如果使用連接池,則事務(wù)在連接被再次使用時(shí)調(diào)用的exec sp_reset_connection存儲(chǔ)過(guò)程清理掉。如果該連接沒(méi)有被再次使用或刪除,則事務(wù)一直存在,便會(huì)一直鎖住相關(guān)資源不釋放,照常日志變大,鏡像和復(fù)制異常等情況。
參考
http://www.cnblogs.com/TeyGao/p/3522965.html
未完待續(xù)
文章來(lái)自筆者博客,使用Markdown編輯發(fā)布,原文地址:SQL Server使用常見(jiàn)誤區(qū)
新聞熱點(diǎn)
疑難解答
圖片精選