以下SQL段,大家認為結果是什么呢?
DECLARE @A VARCHAR(50)SET @A='Zuowenjun.cn'SELECT TOP 1 @A=ISNULL(FIELDNAME,'DEFAULT') FROM TABLENAME WHERE 1=2PRINT @AGO
可能大家都認為結果顯示是:DEFAULT,因為變量@A初始化為:Zuowenjun.cn,在執行SQL查詢后,由于條件1=2不成立,所以查詢結果FIELDNAME的值應該是NULL,然后再執行ISNULL函數,就會將默認值DEFAULT賦給變量@A,然后最終打印是DEFAULT,但實際執行的結果卻并不是這樣,而是Zuowenjun.cn,原因是什么呢?經過我的分析,找到了問題的原因,那就是SELECT語句,在找不到的記錄的情況下,是不會執行賦值操作的(即:ISNULL(FIELDNAME,'DEFAULT')根本沒有執行),所以才會得出該結果,若要解決這個問題,我們可以使用SET關鍵字給變理賦值,如下改良過后SQL段:
DECLARE @A VARCHAR(50)SET @A='Zuowenjun.cn'SET @A=ISNULL((SELECT TOP 1 FIELDNAME FROM TABLENAME WHERE 1=2),'DEFAULT')PRINT @AGO
這樣執行的結果就是DEFAULT,但這樣存在局限性,因為SET只支持單個變量賦值,那同時給多個變量賦值則無法適用,所以如果需要給多個變量同時賦值的情況,我們可以采用如下方法,雖然有點復雜,但不影響執行效率:
DECLARE @A VARCHAR(50),@B VARCHAR(50)SET @A='Zuowenjun.cn'SET @B='XXXX'SELECT @A=ISNULL(FIELDNAME1,'DEFAULT1'),@B=ISNULL(FIELDNAME2,'DEFAULT2')FROM (SELECT 1 AS F1) T1 left join(SELECT TOP 1 FIELDNAME1,FIELDNAME2,1 AS F1 FROM TABLENAME WHERE 1=2) T2 on T1.F1=T2.F1 PRINT @A + '--' + @BGO
說一下原理,因為(SELECT 1 AS F1)始終返回一條記錄1,然后用這個表T1左連接我們要查詢的SQL語句 T2,1 AS F1這個是必需的,因為關聯需要用到,根據左連接的原則,左表不論右邊是符合關聯條件,都會返回記錄,所以最外層的SELECT是一定有值,FIELDNAME1與FIELDNAME2這時都是NULL,執行ISNULL函數自然就得到了默認值。
當然以上情形是用在SQL查詢語句可能存在不符合查詢條件的情況,若確定能返回值,則沒有必要這樣做,或者即使存在不符合的情況,也可以通過后續邏輯判斷來重新給變量賦值達到相同的效果,只是要寫的語句就多些。
該篇文章為作者本人原創,文章內容僅表達個人意見或想法,僅供參考,若大家對此有不同的意見可參與評論,謝謝!
更多IT相關的文章,歡迎光臨我的個人網站:http://www.zuowenjun.cn/
新聞熱點
疑難解答