2012-10-09 70 views
0

過去,我有一個sitution,我需要爲了做一個傳遞一個字符串TSQL 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

'IN'運算符期望**數組的字符串** - 但是,您傳入的參數是單個字符串 - 而不是字符串數組。 –

回答

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

0

你的例子工作是不一樣的,你的例子不起作用。你工作的例子有一個字符串列表。你的例子不起作用只是一個字符串。這意味着您正嘗試檢索公司名稱字段等於整個字符串的行,而不是該字符串的逗號分隔部分。

你們的榜樣不起作用等於:

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

不是以下:

select * from tbl1 where CompanyName IN ('Nestle','UFI') 
0
declare @searchString varchar(50) 
set @searchString = ' ''Nestle'',''UFI'' ' 

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

注意,這是動態SQL它有時令人難以接受和不優化好,但其實很簡單,並會得到你想要的。

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

select * from tbl1 where charindex(',' + CompanyName + ',',@SearchString) > 0