2012-08-08 6 views
7

可能な二重にIN句を作成する:私は、SQL Server 2008を使用していますし、これは私が直面しています問題です
Need help in dynamic query with IN Clause動的ストアドプロシージャ

。私は列会社を持つCarsというテーブルを持っています。今、私はこの

 
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') 

の作品Iストアドプロシージャは配列ではなく1つの文字列として'Ford','BMW'を処理しているように思えます。誰かがこれで私を助けてくれますか?ストアドプロシージャ内のselect文のIN句に必要な文字列/配列を動的に構築する方法

答えて

7

あなたは正しく、1つの文字列を作成しました。これは、1つの文字列を含む文字列のリストとして処理されています。カンマは、その文字列内の単なる文字です。 SQL Serverの配列の唯一の類義語はテーブルです。

たとえば、 WHERE x IN (SELECT y FROM z)。多くの人が列をdelimitted与えコンマからのアイテムのテーブルを返すSPLIT_STRING()関数を作成し、このため

...

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

その分割文字列を実装する多くの方法があります。いくつかのリターン文字列、いくつかは整数にキャストされ、あるものは2番目の "区切り文字"パラメータなどを受け入れます。SQL SERVER SPLIT STRINGのインターネットを検索して、多くの結果を得ることができます - ここにStackOverflowを含みます。


別の動的SQLを使用することです。 SQLを書き込むSQL。

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

SP_EXECEUTESQL @sql 

(前者はあなたがパラメータ化クエリを使用することができますが、後者にはないので、私はちょうどEXECSP_EXECUTESQLをお勧めします。)

+1

だけポイントを追加するために、私は、これは '選択する方が良いと思います*車から 内部結合 ( \t選択項目からdbo.split_string(@ input_string) )k on K.Item = Company'なぜなら、あなたは 'IN'を使って反復を行っているからです。述語 –

+0

最初の方法は私がお勧めする方法です。ここで素敵な分割関数を見つけることができます: [http://www.sqlservercentral.com/articles/Tally+Table /72993/](http://www.sqlservercentral.com/articles/Tally+Table/72993/) – lennin92