我有一个情况,我需要传递一个字符串才能进行IN
declare @searchString varchar(50)
set @searchString = ' ''Nestle'',''UFI'' '
select * from tbl1 where CompanyName IN (@SearchString)
不起作用。
但如果我这样做:
select * from tbl1 where CompanyName IN ('Nestle','UFI')
工作正常。我无法理解为什么一件作品而另一件作品
答案 0 :(得分:1)
使用IN
时,它会查看一个集合,而不是单个字符串表达式。因为这
你需要实现一个像CsvToInt
这样的函数来返回一个表,如下所示:
CREATE Function [dbo].[CsvToInt] ( @Array varchar(1000))
returns @IntTable table
(IntValue int)
--Parse comma seperated value parameters
--To be used in SELECT blah WHERE blah IN (...)
--This function returns int, but may be modified to return any datatype
AS
begin
declare @separator char(1)
set @separator = ','
declare @separator_position int
declare @array_value varchar(1000)
set @array = @array + ','
while patindex('%,%' , @array) <> 0
begin
select @separator_position = patindex('%,%' , @array)
select @array_value = left(@array, @separator_position - 1)
Insert @IntTable
Values (Cast(@array_value as int))
select @array = stuff(@array, 1, @separator_position, '')
end
return
end
然后您可以在存储过程中使用此函数,如下所示:
SELECT Blah
FROM MyTable
WHERE Foo IN (SELECT * FROM dbo.CsvToInt(@Parameter))
其中@Parameter
包含逗号分隔的值字符串,如:
Nestle, UFI, Test
答案 1 :(得分:1)
IN表示一个集合,而不是一个字符串作为参数。
见:
答案 2 :(得分:0)
您的示例与您的不起作用的示例不同。您的示例有一个字符串列表。您的示例不起作用只是一个字符串。这意味着您正在尝试检索CompanyName字段等于整个字符串的行,而不是该字符串的逗号分隔部分。
您无效的示例等于:
select * from tbl1 where CompanyName IN (' ''Nestle'',''UFI'' ')
不是以下内容:
select * from tbl1 where CompanyName IN ('Nestle','UFI')
答案 3 :(得分:0)
declare @searchString varchar(50)
set @searchString = ' ''Nestle'',''UFI'' '
exec ('select * from tbl1 where CompanyName IN (' + @SearchString + ');')
请注意,这是动态SQL,有时不赞成并且不能很好地优化,但它很简单并且可以得到你想要的。
答案 4 :(得分:0)
declare @searchString varchar(50)
set @searchString = 'Nestle,UFI'
set @searchString = ',' + @searchString + ','
select * from tbl1 where charindex(',' + CompanyName + ',',@SearchString) > 0