一尘不染

如果作为参数传递,则tsql IN无法正常工作

sql

我有一个需要传递字符串才能进行IN的情况

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

    select * from tbl1 where CompanyName IN (@SearchString)

不起作用。

但是,如果我这样做:

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

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


阅读 170

收藏
2021-05-16

共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

2021-05-16