SQL Server查询条件IN中能否使用变量的示例详解

 更新时间:2021年01月18日 08:41:11   作者:潇湘隐者  
这篇文章主要介绍了SQL Server查询条件IN中能否使用变量,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在SQL Server的查询条件中,能否在IN里面使用变量呢? 如果可以的话,有没有需要注意的地方或一些限制呢?在回答这个问题前,我们先来看看这个例子:

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

如下所示,如果查询条件里面,变量只有一个值,此时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里面输入多个值呢?假如有这样的一个需求,一个变量里面包含b和c的值,现在用'b|c'作为条件传入,对其进行拆分为变量'b'和'c', 想查出name=b 和name=c的记录,如下截图所示,SQL其实并没有按你所“设想/预想”的查出对应记录,而是将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 + ''''));

下面这个SQL也是同样的结果。

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 );

为什么出现了这样的结果呢? 查了大量的官方文档,没有看到关于这个问题的介绍和解释。如果一定要解释上面现象的情况的话,那么是因为SELECT * FROM TEST WHERE name IN (@name2 ); 其实转化为了SELECT * FROM TEST WHERE name =@name2; 也就是说,上面SQL并不会按你所“设想”的逻辑运算。而是做了一个转换,为什么说是这样的一个转换呢? 当然这也是一个猜想,上面构造的例子也是为了侧面验证这个猜想,另外,上面两个SQL实际执行计划的参数列表(Parameter List)也侧面印证了这个猜想。如果执行计划解析成我们想要的结果,那么Parameter List应该是'b' 和‘c'

解决方案:

1:使用动态SQL

使用动态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:使用临时表或表变量

以这个例子来说,就是将字符串拆分,放入临时表或表变量,然后关联表也好,在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函数只有较高版本才支持,SQL Server 2017或SQL Server 2016部分版本支持。

4:借助XML函数来解决问题

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 ) );

到此这篇关于SQL Server查询条件IN中能否使用变量的文章就介绍到这了,更多相关sqlserver条件查询in内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQLServer RANK() 排名函数的使用

    SQLServer RANK() 排名函数的使用

    本文主要介绍了SQLServer RANK() 排名函数的使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 我也有微信朋友圈了 Android实现

    我也有微信朋友圈了 Android实现

    最近写了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照或者从相册选取,从相册选取可以一次选择多张照片,并且限制照片的张数,想拥有真正属于自己的朋友圈吗?快来围观
    2016-05-05
  • SqlServer 多种分页方式 详解(含简单速度测试)

    SqlServer 多种分页方式 详解(含简单速度测试)

    这篇文章主要介绍了SqlServer 多种分页方式 (含简单速度测试),附带50万数据分页时间[本机访问|已重启SQL服务|无其他程序干扰][非索引排序],需要的朋友可以参考下
    2022-12-12
  • 解析SQL Server CDC配合Kafka Connect监听数据变化的问题

    解析SQL Server CDC配合Kafka Connect监听数据变化的问题

    这篇文章主要介绍了SQL Server CDC配合Kafka Connect监听数据变化,除了数据库开启CDC支持以外,主要还是要将变更的数据通过Kafka Connect传输数据,Debezium是目前官方推荐的连接器,本文给大家分享实现步骤,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • SQL Server 2008图文安装教程

    SQL Server 2008图文安装教程

    从安装程序看,感觉SQL Server 2008的设计更灵活、更精确,安装速度在我的笔记本上装的虚拟机(分配了768M内存)中比较流畅,感觉比2005要好。
    2009-02-02
  • mssql2005,2008导出数据字典实现方法

    mssql2005,2008导出数据字典实现方法

    在项目开发过程中会用到数据字典,本文将详细介绍mssql2005,2008如何导出数据字典,需要了解更多的朋友可以参考下
    2012-11-11
  • Sql Server 分组统计并合计总数及WITH ROLLUP应用

    Sql Server 分组统计并合计总数及WITH ROLLUP应用

    WITH ROLLUP 在生成包含小计和合计的报表时,ROLLUP 运算符很有用,ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集,接下来介绍Sql Server 分组统计并合计总数实现代码,感兴趣的朋友可以了解下哦
    2013-01-01
  • SQL Server游标的介绍与使用

    SQL Server游标的介绍与使用

    今天小编就为大家分享一篇关于SQL Server游标的介绍与使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • sqlserver中关于WINDOWS性能计数器的介绍

    sqlserver中关于WINDOWS性能计数器的介绍

    sqlserver中关于WINDOWS 性能计数器的介绍,需要的朋友可以看下
    2013-01-01
  • 仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案

    仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案

    这篇文章主要介绍了仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05

最新评论