最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL Server查詢條件IN中能否使用變量的示例詳解

 更新時(shí)間:2021年01月18日 08:41:11   作者:瀟湘隱者  
這篇文章主要介紹了SQL Server查詢條件IN中能否使用變量,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在SQL Server的查詢條件中,能否在IN里面使用變量呢? 如果可以的話,有沒有需要注意的地方或一些限制呢?在回答這個(gè)問題前,我們先來看看這個(gè)例子:

IF EXISTS (SELECT 1 FROM sys.objects WHERE name='TEST' AND type='U')
BEGIN
 DROP TABLE TEST;
END
GO
CREATE TABLE TEST ( ID INT, NAME VARCHAR(16) );
GO
 
INSERT INTO dbo.TEST
SELECT 1, 'a' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 4, 'a,b'UNION ALL
SELECT 5, '''b'',''c''' UNION ALL
SELECT 6, '''b';
GO

如下所示,如果查詢條件里面,變量只有一個(gè)值,此時(shí)SQL是正常的。

DECLARE @name VARCHAR(16);
SET @name='a';
 
SELECT * FROM TEST WHERE name IN (@name);
GO
 
DECLARE @name VARCHAR(16);
SET @name='a,b';
 
SELECT * FROM TEST WHERE name IN (@name);
GO

如果我們想在查詢條件IN里面輸入多個(gè)值呢?假如有這樣的一個(gè)需求,一個(gè)變量里面包含b和c的值,現(xiàn)在用'b|c'作為條件傳入,對(duì)其進(jìn)行拆分為變量'b'和'c', 想查出name=b 和name=c的記錄,如下截圖所示,SQL其實(shí)并沒有按你所“設(shè)想/預(yù)想”的查出對(duì)應(yīng)記錄,而是將ID=5的記錄查出來了

DECLARE @name1 VARCHAR(16);
DECLARE @name2 VARCHAR(16);
SET @name1='b|c';
SET @name2=REPLACE(@name1,'|',''',''')
SELECT @name2
 
SELECT * FROM TEST WHERE name IN (('''' + @name2 + ''''));

下面這個(gè)SQL也是同樣的結(jié)果。

DECLARE @name1 VARCHAR(16);
DECLARE @name2 VARCHAR(16);
SET @name1='b|c';
SET @name2='''' + REPLACE(@name1,'|',''',''') +''''
SELECT @name2
 
SELECT * FROM TEST WHERE name IN (@name2 );

為什么出現(xiàn)了這樣的結(jié)果呢? 查了大量的官方文檔,沒有看到關(guān)于這個(gè)問題的介紹和解釋。如果一定要解釋上面現(xiàn)象的情況的話,那么是因?yàn)镾ELECT * FROM TEST WHERE name IN (@name2 ); 其實(shí)轉(zhuǎn)化為了SELECT * FROM TEST WHERE name =@name2; 也就是說,上面SQL并不會(huì)按你所“設(shè)想”的邏輯運(yùn)算。而是做了一個(gè)轉(zhuǎn)換,為什么說是這樣的一個(gè)轉(zhuǎn)換呢? 當(dāng)然這也是一個(gè)猜想,上面構(gòu)造的例子也是為了側(cè)面驗(yàn)證這個(gè)猜想,另外,上面兩個(gè)SQL實(shí)際執(zhí)行計(jì)劃的參數(shù)列表(Parameter List)也側(cè)面印證了這個(gè)猜想。如果執(zhí)行計(jì)劃解析成我們想要的結(jié)果,那么Parameter List應(yīng)該是'b' 和‘c'

解決方案:

1:使用動(dòng)態(tài)SQL

使用動(dòng)態(tài)SQL解決問題,似乎沒啥好說的,如下例子所示:

DECLARE @sql_cmd NVARCHAR(max);
DECLARE @name VARCHAR(16);
 
SET @name='b|c';
SET @sql_cmd='SELECT * FROM TEST WHERE name IN (''' + REPLACE(@name,'|',''',''') +''');'
 
EXEC sp_executesql @sql_cmd;

2:使用臨時(shí)表或表變量

以這個(gè)例子來說,就是將字符串拆分,放入臨時(shí)表或表變量,然后關(guān)聯(lián)表也好,在IN里面使用子查詢也OK。

3:借助STRING_SPLIT()

DECLARE @name VARCHAR(16);
 
SET @name='b|c';
SELECT *FROM test WHERE name IN (SELECT value FROM STRING_SPLIT(@name, '|'))

注意:STRING_SPLIT函數(shù)只有較高版本才支持,SQL Server 2017或SQL Server 2016部分版本支持。

4:借助XML函數(shù)來解決問題

DECLARE @name VARCHAR(16);
DECLARE @xml_para XML;
 
SET @name = 'b|c';
SET @xml_para = CAST(( '<A>' + REPLACE(@name, '|', '</A><A>') + '</A>' ) AS XML);
 
 
SELECT *
FROM dbo.TEST
WHERE NAME IN ( SELECT A.value('.', 'varchar(max)') AS [Column]
     FROM  @xml_para.nodes('A') AS FN ( A ) );

到此這篇關(guān)于SQL Server查詢條件IN中能否使用變量的文章就介紹到這了,更多相關(guān)sqlserver條件查詢in內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQL Server數(shù)據(jù)庫設(shè)置自動(dòng)備份策略的完整步驟

    SQL Server數(shù)據(jù)庫設(shè)置自動(dòng)備份策略的完整步驟

    這篇文章主要給大家介紹了關(guān)于SQL Server數(shù)據(jù)庫設(shè)置自動(dòng)備份策略的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用sql server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • SQL的小常識(shí), 備忘之用, 慢慢補(bǔ)充.

    SQL的小常識(shí), 備忘之用, 慢慢補(bǔ)充.

    SQL的小常識(shí), 備忘之用, 慢慢補(bǔ)充.
    2011-10-10
  • Superset實(shí)現(xiàn)動(dòng)態(tài)SQL查詢功能

    Superset實(shí)現(xiàn)動(dòng)態(tài)SQL查詢功能

    這篇文章給大家介紹使用自定義參數(shù)方式實(shí)現(xiàn) superset 實(shí)現(xiàn)SQL動(dòng)態(tài)查詢功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08
  • 什么是數(shù)據(jù)庫 SQL Execution Plan(簡單介紹)

    什么是數(shù)據(jù)庫 SQL Execution Plan(簡單介紹)

    SQL Execution PlanSQL 執(zhí)行計(jì)劃是數(shù)據(jù)庫管理系統(tǒng)在執(zhí)行SQL語句時(shí),對(duì)如何高效檢索數(shù)據(jù)進(jìn)行的一系列優(yōu)化步驟的描述,這篇文章主要介紹了什么是數(shù)據(jù)庫 SQL Execution Plan,需要的朋友可以參考下
    2024-03-03
  • SqlServer數(shù)據(jù)庫腳本執(zhí)行命令行指令方式

    SqlServer數(shù)據(jù)庫腳本執(zhí)行命令行指令方式

    這篇文章主要介紹了SqlServer數(shù)據(jù)庫腳本執(zhí)行命令行指令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SQL報(bào)錯(cuò)注入之updatexml的實(shí)現(xiàn)

    SQL報(bào)錯(cuò)注入之updatexml的實(shí)現(xiàn)

    updatexml函數(shù)通過輸入不符合XPATH格式的數(shù)據(jù)來觸發(fā)報(bào)錯(cuò),并利用這一點(diǎn)進(jìn)行SQL注入,通過分析報(bào)錯(cuò)信息,可以判斷是否存在注入點(diǎn),并逐步爆出數(shù)據(jù)庫名、表名、字段名以及敏感數(shù)據(jù),感興趣的可以了解一下
    2024-10-10
  • SQLSERVER查看數(shù)據(jù)庫日志方法與語句示例代碼(已親測(cè))

    SQLSERVER查看數(shù)據(jù)庫日志方法與語句示例代碼(已親測(cè))

    在數(shù)據(jù)庫使用很久后日志文件會(huì)累計(jì)的越來越大,如果硬盤空間不足可能會(huì)導(dǎo)致宕機(jī),下面這篇文章主要給大家介紹了關(guān)于SQLSERVER查看數(shù)據(jù)庫日志方法與語句的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • sql中COALESCE函數(shù)的使用小結(jié)

    sql中COALESCE函數(shù)的使用小結(jié)

    COALESCE函數(shù)用于從其參數(shù)列表中返回第一個(gè)非NULL值,本文主要介紹了sql中COALESCE函數(shù)的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • 復(fù)制SqlServer數(shù)據(jù)庫的方法

    復(fù)制SqlServer數(shù)據(jù)庫的方法

    復(fù)制SqlServer數(shù)據(jù)庫的方法...
    2007-03-03
  • sql中常見的四種排名函數(shù)的用法

    sql中常見的四種排名函數(shù)的用法

    本文主要介紹了sql中常見的四種排名函數(shù)的用法,主要包括row_number,rank,dense_rank,ntile,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論

云龙县| 蒙山县| 镇安县| 峨山| 汝城县| 重庆市| 梅河口市| 延安市| 邵东县| 抚顺市| 城步| 海宁市| 韶关市| 仁怀市| 桂阳县| 桐庐县| 平定县| 江达县| 贵德县| 临潭县| 邢台县| 巴塘县| 颍上县| 南昌县| 望江县| 淮安市| 浪卡子县| 离岛区| 剑川县| 长兴县| 九寨沟县| 吉林市| 翁牛特旗| 滦平县| 德兴市| 西乌| 泽州县| 明溪县| 海晏县| 鄱阳县| 弥勒县|