国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

警惕SQL語(yǔ)句陷井

2024-07-21 02:48:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
警惕SQL語(yǔ)句陷井

以下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/


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 达拉特旗| 榕江县| 饶河县| 清新县| 霍山县| 泰来县| 青冈县| 梁山县| 霍山县| 陇南市| 柘荣县| 丁青县| 邢台县| 柯坪县| 扎赉特旗| 和平县| 弥勒县| 延吉市| 河源市| 苗栗市| 阿尔山市| 忻州市| 方正县| 遵义市| 宁陕县| 梧州市| 邳州市| 江达县| 西贡区| 新竹县| 四会市| 库尔勒市| 呼图壁县| 华亭县| 六安市| 西藏| 南召县| 新郑市| 康保县| 兴安盟| 内江市|