在 Sql Server 中将集合作为参数传递时使用 IN 子句

Posted

技术标签:

【中文标题】在 Sql Server 中将集合作为参数传递时使用 IN 子句【英文标题】:With IN Clause when Passing Collection as Parameter In Sql Server 【发布时间】:2013-08-27 16:27:35 【问题描述】:

查询给出 O/p 为

ItemSizeNM

(colName)

'U','V','X','Y'

但是当我在我所做的代码中使用它作为 IN Query 的输入时。 它没有给出相同的结果集。为什么会发生这种情况...? 表 MstItemSize 有正确的数据。

 declare @tblRingSize table ( ringSize varchar(100))        
     declare  @ringSize varchar(100)         
     select   @ringSize= cast((otherringSize) as varchar) 
     from ##tempBand  where styleNo='BD00002';   

    插入到@tblRingSize 从 dbo.SplitStrings_CTE 中选择项目(@ringSize,',');

    从 MstItemSize 中选择 ItemSizeNm,其中 SizeTypeNm ='Ring' 和 项目尺寸Nm 在 --('U','V','X','Y')

    ( 选择替换 ( (select STUFF((select ''',''' + ringSize from @tblRingSize For XML PATH('')),1,2,'') +'''' ) ,' ',''))

    选择替换 ( (select STUFF((select ''',''' + ringSize from @tblRingSize For XML PATH('')),1,2,'') +'''' ) ,' ','')

【问题讨论】:

尽量不要使用varchar,而是使用varchar(100)。另外,您为什么要使用全局##temp 表? SplitStrings_CTE 的定义是什么? ##tempBand中otherringSize的数据类型是什么? 我使用 Global temp 因为我也想在其他查询中使用该表。SplitStrings_CTE 函数将逗号分隔字符,otherringSize 的数据类型是 varchar(100) 其他查询在哪里?我也知道 split 函数的作用,但也许它做得不对(例如,varchar 声明可能会默默地截断您的字符串)。你从哪里得到的功能? sqlperformance.com/2012/07/t-sql-queries/split-strings from Here 我得到了这个函数 SplitStrings_CTE 跟踪你正在做的事情或你期望的输出真的很难。 @ringSize是多少?它是否包含那些字符串分隔符,所以它是@ringSize = '''U'',''V'',...'; 你期望什么输出? 【参考方案1】:

子查询不需要使用STUFFFOR XMLREPLACE

select 
    ItemSizeNm 
from 
    MstItemSize 
where SizeTypeNm ='Ring' 
and ItemSizeNm  in (select ringSize from @tblRingSize)

【讨论】:

它只给出第一个值。即 U I Want It as U V X Y 第二次替换给我一个正确的结果,如 'U'、'V'、'X'、'Y' 当我复制它并在 IN 子句中传递它时,它评论它工作正常。但是当使用那个 REPLACE 语句时它不起作用 不需要相同的格式。事实上,它根本不应该被格式化——子查询应该返回一个记录集,而不是你手动构建的字符串。 sqlfiddle.com/#!3/d89a9/4 请参阅此示例。你会知道...第三个查询没有显示输出...为什么..? 因为在您的场景中,您将整个字符串选择到记录集中,并且它试图将您构建的整个字符串与任何一个字符匹配。为了做你想做的事情(这也是完全没有必要的),你必须动态地构建你的整个 SQL 语句,就像这样:sqlfiddle.com/#!3/d89a9/86

以上是关于在 Sql Server 中将集合作为参数传递时使用 IN 子句的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 存储过程中将表作为参数传递

如何在用户定义的函数中将数据库列作为参数传递?

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?

在存储过程中将输入参数作为值传递

在 SQL Server 2008 中使用集合作为函数/存储过程的参数?

如何在oracle中将对象类型的对象作为参数传递