[MSSQL 2008] 不支援short-circuit evaluation 最小化計算
客戶這陣子的專案在進行系統改寫以及資料庫的升級(MS SQL2000升至MS SQL2008),發現有一些sql statement在2000上跑得好好的,但搬到2008後就老是有錯誤訊息。看過他的sql statement後發現還真挺有趣的:
如上的程式碼,目的是要找出TestTable中Name這個欄位裡值為##_EE_AAA_Selection及##_EE_BBB_Selection的紀錄。
在sql 2000上的確可以正常執行,當在sql 2008上執行時就會得到錯誤訊息:
這個錯誤指出因為在TestTable當若Name這個欄位裡有不含’_’的紀錄,造成了Substring函數裡的length參數為負數。
一般以最小化計算來看,應當條件1不符合時就毋須再判斷條件2,自然不會有負數的問題才是啊! 然而sql server會依據資料量、索引等各種狀況來決定執行計畫,所以沒有辦法知道它會從哪個條件先判斷起。因此,像這類的sql statement時最好還是用case… when… 避掉潛藏的bug比較保險。