8

重複の可能性:
IN 句を使用した動的クエリでヘルプが必要

私は SQL Server 2008 を使用していますが、これが私が直面している問題です。Company 列を持つ Cars という名前のテーブルがあります。今、私はこのようなストアドプロシージャを持っています

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

私はこのようなことを試みましたが失敗しました

DECLARE @CompanyNames varchar(500)
SET @CompanyNames = '''フォード'',''BMW'''

exec FindCars @CompanyNames

行が返されません。私が次のことをするとき

DECLARE @CompanyNames varchar(500)
SET @CompanyNames = '''フォード'',''BMW'''

@CompanyNames を選択

次の結果が得られます

「フォード」、「BMW」

ストアドプロシージャ内のselectステートメントでこの値を置き換えると、機能します

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

'Ford','BMW'したがって、ストアド プロシージャは配列ではなく 1 つの文字列として扱われているように思われます。誰かがこれを手伝ってくれませんか。ストアド プロシージャ内の select ステートメントの IN 句で必要な文字列/配列を動的に構築するにはどうすればよいですか。

4

1 に答える 1

7

そうです、1 つの文字列を作成しました。これは、1 つの文字列を含む文字列のリストとして処理されています。コンマは、その 1 つの文字列内の単なる文字です。SQL Server の配列に相当するのはテーブルだけです。

例えば; WHERE x IN (SELECT y FROM z).

このため、多くの人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

(前者ではパラメーター化されたクエリを使用できますが、後者では使用できないという理由SP_EXECUTESQLだけで、お勧めしません。)EXEC

于 2012-08-08T11:53:29.753 に答える