以下SQL段,大家認(rèn)為結(jié)果是什么呢?
DECLARE @A VARCHAR(50)SET @A='Zuowenjun.cn'SELECT TOP 1 @A=ISNULL(FIELDNAME,'DEFAULT') FROM TABLENAME WHERE 1=2PRINT @AGO
可能大家都認(rèn)為結(jié)果顯示是:DEFAULT,因?yàn)樽兞緻A初始化為:Zuowenjun.cn,在執(zhí)行SQL查詢后,由于條件1=2不成立,所以查詢結(jié)果FIELDNAME的值應(yīng)該是NULL,然后再執(zhí)行ISNULL函數(shù),就會(huì)將默認(rèn)值DEFAULT賦給變量@A,然后最終打印是DEFAULT,但實(shí)際執(zhí)行的結(jié)果卻并不是這樣,而是Zuowenjun.cn,原因是什么呢?經(jīng)過(guò)我的分析,找到了問(wèn)題的原因,那就是SELECT語(yǔ)句,在找不到的記錄的情況下,是不會(huì)執(zhí)行賦值操作的(即:ISNULL(FIELDNAME,'DEFAULT')根本沒(méi)有執(zhí)行),所以才會(huì)得出該結(jié)果,若要解決這個(gè)問(wèn)題,我們可以使用SET關(guān)鍵字給變理賦值,如下改良過(guò)后SQL段:
DECLARE @A VARCHAR(50)SET @A='Zuowenjun.cn'SET @A=ISNULL((SELECT TOP 1 FIELDNAME FROM TABLENAME WHERE 1=2),'DEFAULT')PRINT @AGO
這樣執(zhí)行的結(jié)果就是DEFAULT,但這樣存在局限性,因?yàn)镾ET只支持單個(gè)變量賦值,那同時(shí)給多個(gè)變量賦值則無(wú)法適用,所以如果需要給多個(gè)變量同時(shí)賦值的情況,我們可以采用如下方法,雖然有點(diǎn)復(fù)雜,但不影響執(zhí)行效率:
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
說(shuō)一下原理,因?yàn)?SELECT 1 AS F1)始終返回一條記錄1,然后用這個(gè)表T1左連接我們要查詢的SQL語(yǔ)句 T2,1 AS F1這個(gè)是必需的,因?yàn)殛P(guān)聯(lián)需要用到,根據(jù)左連接的原則,左表不論右邊是符合關(guān)聯(lián)條件,都會(huì)返回記錄,所以最外層的SELECT是一定有值,F(xiàn)IELDNAME1與FIELDNAME2這時(shí)都是NULL,執(zhí)行ISNULL函數(shù)自然就得到了默認(rèn)值。
當(dāng)然以上情形是用在SQL查詢語(yǔ)句可能存在不符合查詢條件的情況,若確定能返回值,則沒(méi)有必要這樣做,或者即使存在不符合的情況,也可以通過(guò)后續(xù)邏輯判斷來(lái)重新給變量賦值達(dá)到相同的效果,只是要寫(xiě)的語(yǔ)句就多些。
該篇文章為作者本人原創(chuàng),文章內(nèi)容僅表達(dá)個(gè)人意見(jiàn)或想法,僅供參考,若大家對(duì)此有不同的意見(jiàn)可參與評(píng)論,謝謝!
更多IT相關(guān)的文章,歡迎光臨我的個(gè)人網(wǎng)站:http://www.zuowenjun.cn/
新聞熱點(diǎn)
疑難解答
圖片精選