0

我有一种情况,我需要传递一个字符串才能执行 IN

    declare @searchString varchar(50)
    set @searchString = ' ''Nestle'',''UFI'' '

    select * from tbl1 where CompanyName IN (@SearchString) 

不起作用。

但如果我这样做:

    select * from tbl1 where CompanyName IN ('Nestle','UFI')

它工作正常。我不明白为什么一个工作而另一个不工作

4

5 回答 5

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

于 2012-10-09T15:20:20.347 回答
1

IN 将一个集合,而不是一个字符串作为参数。

看到这个:

http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/33108337-b7b4-4ada-a480-60673e175f4d/

于 2012-10-09T15:21:18.507 回答
0
declare @searchString varchar(50)
set @searchString = ' ''Nestle'',''UFI'' '

exec ('select * from tbl1 where CompanyName IN (' + @SearchString + ');')

Note that this is dynamic SQL which is sometimes frowned upon and does not optimize well, but it's simple and will get what you want.

于 2012-10-09T15:32:30.703 回答
0

您的有效示例与您无效的示例不同。您的有效示例有一个字符串列表。您不起作用的示例只是一个字符串。这意味着您正在尝试检索 CompanyName 字段等于整个字符串的行,而不是该字符串的逗号分隔部分。

您不起作用的示例等于:

select * from tbl1 where CompanyName IN (' ''Nestle'',''UFI'' ')

不是以下内容:

select * from tbl1 where CompanyName IN ('Nestle','UFI')
于 2012-10-09T15:19:07.733 回答
0
declare @searchString varchar(50)
set @searchString = 'Nestle,UFI'
set @searchString = ',' + @searchString + ','

select * from tbl1 where charindex(',' + CompanyName + ',',@SearchString) > 0 
于 2013-09-20T01:42:29.463 回答