Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql server中使用带“in”运算符的%通配符_Sql_Sql Server - Fatal编程技术网

在sql server中使用带“in”运算符的%通配符

在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将返

我有一个存储过程,我传递一个逗号分隔的值列表作为@At1

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,如果不需要不同的结果,您会怎么做?这是一个隐藏在潜在缺陷之上的黑客攻击。这也是一个潜在的性能问题。