在sql server中使用带“in”运算符的%通配符
我有一个存储过程,我传递一个逗号分隔的值列表作为@At1在sql server中使用带“in”运算符的%通配符,sql,sql-server,Sql,Sql Server,我有一个存储过程,我传递一个逗号分隔的值列表作为@At1 Create spGetProducts @At1 VARCHAR(200) begin select * from tblProducts where Category1 IN (SELECT * FROM CSVToTable(@At2)) end 函数CSVToTable基本上接受逗号分隔的值,并将它们放入表中 问题是我想使用一个类似于IN运算符的通配符,但这不起作用 因此,如果我有一个行内类别1测试,并且CSVTOTABLE将返
Create spGetProducts @At1 VARCHAR(200)
begin
select * from tblProducts where Category1 IN (SELECT * FROM CSVToTable(@At2))
end
函数CSVToTable基本上接受逗号分隔的值,并将它们放入表中
问题是我想使用一个类似于IN运算符的通配符,但这不起作用
因此,如果我有一个行内类别1测试,并且CSVTOTABLE将返回一个值“es”,那么它将选择该行,就像我有%es%一样。
基本上,我只想在使用in运算符时在逗号分隔的值中有百分号
im使用sql server 2012
编辑
my CSVTABLE返回一列表,每行有一个逗号分隔的值。将IN重写为EXISTS(更通用):
select *
from tblProducts p
where exists (
select *
from CSVToTable(@At2)
where Category1 LIKE (SomeExpressionInvolvingTheResultFromCSV)
)
出于缓存原因,您可能希望首先将CSVToTable中的结果拉入表变量或临时表。将中替换为上的联接
select distinct t.* from tblProducts t
inner join CSVToTable(@At2) f
on t.category1 like f.field1
您的函数返回一行还是多行?不要在in子句中使用*,只有exist子句可以使用它。您需要选择一个value@DarrenKopp他的函数显然只返回一列table,并建议不要对存储过程名称使用sp前缀。请阅读此处以了解更多信息@M.Ali-如果存在重复的匹配项,则可能会重复行。@usr只需添加distinct,如果不需要不同的结果,您会怎么做?这是一个隐藏在潜在缺陷之上的黑客攻击。这也是一个潜在的性能问题。