2012-08-08 87 views
7

可能重複:
Need help in dynamic query with IN Clause在存儲過程中動態創建IN子句

我使用SQL Server 2008,這是我面臨的問題。我有一個名爲汽車與列公司的表。現在我有一個存儲過程,看起來像這樣

 
CREATE PROCEDURE FindCars (@CompanyNames varchar(500)) 
AS 
SELECT * FROM Cars WHERE Company IN (@CompanyNames) 

我想是這樣的,未能

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

exec FindCars @CompanyNames 

我沒有得到任何行返回。當我做了以下

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

Select @CompanyNames 

我得到以下結果

 
'Ford','BMW' 

,如果我在存儲過程中的SELECT語句替換該值,它的工作原理

 
SELECT * FROM Cars where Company in ('Ford','BMW') 

因此我認爲存儲過程似乎將'Ford','BMW'視爲一個字符串而不是數組。有人可以幫助我這個。如何動態構造存儲過程中select語句的IN子句中所需的字符串/數組。

回答

7

你是對的,你創建一個字符串,並且被處理爲包含一個字符串的字符串列表。逗號只是那個字符串中的字符。 SQL Server中的數組唯一等價的是表。

例如; WHERE x IN (SELECT y FROM z)

爲此,許多人創建一個SPLIT_STRING()函數,返回從給定逗號delimitted串項目表...

WHERE x IN (SELECT item FROM dbo.split_string(@input_string)) 

有執行該分割字符串許多方面。一些返回字符串,一些轉換爲整數,一些接受第二個「分隔符」參數等等。您可以在因特網上搜索SQL SERVER SPLIT STRING並獲得許多結果 - 包括在StackOverflow中。


一種替代方法是使用動態SQL;寫SQL的SQL。

SET @sql = 'SELECT * FROM x WHERE y IN (' + @input_string_list + ')' 

SP_EXECEUTESQL @sql 

(我建議SP_EXECUTESQL經過短短EXEC因爲前者允許你使用參數化查詢,但後者沒有。)

+1

只是補充一點,我覺得這是更好的'選擇*從汽車 內部加入 ( \t選擇項目從dbo.split_string(@input_string) )k 在K.Item = Company'因爲你用'IN'做迭代Predicate – 2012-08-08 11:59:58

+0

第一種方法是我推薦的方法,你可以在這裏找到一個很好的分割函數: [http://www.sqlservercentral.com/articles/Tally+Table /72993/](http://www.sqlservercentral.com/articles/Tally+Table/72993/) – lennin92 2017-02-20 15:25:32

相關問題