4

[更新:SQLServer2005の使用]

こんにちは、私がやりたいのは、データの行を取得するために、値(ID)のコンマ区切りリストを使用してストアドプロシージャをクエリすることです。

私が受け取っている問題は、変換エラーです。

Conversion failed when converting the varchar value ' +
@PassedInIDs + ' to data type int.

私のwhere節とエラーのステートメントは次のとおりです。

...
AND (database.ID IN (' + @PassedInIDs + '))

注:database.IDはint型です。

私は次の記事をフォローしていました:

http://www.sql-server-helper.com/functions/comma-delimited-to-table.aspx

しかし、エラーのために完了しませんでした。

私の実行スクリプトには次のものがあります。

...
@PassedInIDs= '1,5'

私はここで何か間違ったことをしていますか?ご協力ありがとうございました。

4

9 に答える 9

1

そのリンクの 2 番目の方法を使用することを強くお勧めします。コンマ区切りの文字列をテーブルに変換するユーザー定義関数を作成します。テーブルから簡単に選択できます。

Erland と "Dynamic SQL" で Google を実行すると、彼はそれに伴う落とし穴について適切な記事を書いています。

于 2009-02-05T18:45:20.320 に答える
1

1 つは、SQL の IN 関数に文字列を渡すことです。元の記事を振り返ると、直接 SQL ステートメントを発行する代わりに、string実行する SQL ステートメントである を作成していることがわかります。

于 2009-02-05T18:45:24.097 に答える
1

SQL には文字列評価はありません。これ:

database.ID IN (' + @PassedInIDs + ')

にはなりません:

database.ID IN (1,2,3)

@PassedInIDsパラメータにたまたま含まれているため'1,2,3'です。あなたが持っているのはを含む文字列だけなので、パラメータは見られません" + @PassedInIDs + "。構文的には、これは次と同等です。

database.ID IN ('Bob')

簡単に言うと、ここで試みていることを SQL で行うことはできません。しかし、他に 4 つの可能性があります。

  1. 呼び出し言語で SQL 文字列を作成し、ストアド プロシージャを完全に破棄します。
  2. 使用するパンと同じ数のパラメーターを IN 句に指定して動的準備済みステートメントを使用する
  3. たとえば、10個のパラメータを持つ固定の準備済みステートメントを使用しIN (?,?,?,?,?,?,?,?,?,?)ます。必要な数だけ入力し、残りをNULLに設定します
  4. たとえば、10 個のパラメーターを使用してストアド プロシージャを作成し、必要な数だけ渡し、他を NULL: に設定しますIN (@p1, @p2, ..., @p10)
于 2009-02-05T18:47:38.990 に答える
1

CLR テーブル値関数を作成します。

http://msdn.microsoft.com/en-us/library/ms131103.aspx

その中で、文字列を個別に解析し、一連の行への変換を実行します。その後、そのテーブルの結果に結合するか、IN を使用して ID がリストにあるかどうかを確認できます。

于 2009-02-05T18:50:37.720 に答える
0

これは、Narayana の記事Passing a list/array to an SQL Server stored procedure に記載されている 6 つの方法で解決できます。

そして、私の最も率直な実装は

declare @statement nvarchar (256)
set @statement = 'select * from Persons where Persons.id in ('+ @PassedInIDs +')'
exec sp_executesql @statement

    -
于 2009-02-05T19:20:28.067 に答える
0

テーブルのように ufn_CSVToTable を扱う必要があります。したがって、関数に参加できます。

JOIN ufn_CSVToTable(@PassedInIDs) uf ON database.ID = uf.[String]
于 2009-02-05T18:09:35.243 に答える
0

SQL 2005 では、これに XML を使用することをお勧めします。XML をテーブルに選択して結合または挿入することができます。

まだ見ていない場合は、Sql Server の OPENXML() を見てください。

たとえば、「12...」のように渡すことができます。

そして、次を使用します。

exec sp_xml_preparedocument @doc OUTPUT, @xmlParam

SELECT element 
FROM OPENXML (@doc, 'Array/Value', 2) WITH (element varchar(max) 'text()')

それが始まりのはず

于 2009-02-05T18:36:52.850 に答える