在 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】:
子查询不需要使用STUFF
、FOR XML
或REPLACE
:
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 子句的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?