2009-03-06 5 views
13

どうすれば私が書くことができるように(例えば)@IDListを渡すことができるストアドプロシージャを構築できますか:ストアドプロシージャを使用して "in"リストを渡す

Select * from Foo Where ID in @IDList 

これは実行可能ですか?

+0

としてのDataTableに渡すコードから呼び出しますか?どの言語からリストを渡していますか? – bstoney

答えて

0

テーブルBに個別のIDを書き込み、すべて同じ「キー」(おそらくGUID)を使用します。
そして、テーブルAに対してクエリが

where ID in (select ID from B where key = @TempKey) 

が含まれるであろう(あなたがそれらを終了している場合は、その後、キーを削除することがあります。また、それらをタイムスタンプとSQLの仕事を持っているが、後でそれを行う。)

長所:

  • あなたはいくつかの状況で注入をSQLに公開することができた文字列を、送信しません。
  • あなたの他のアプリケーションロジックによっては、可能性を一度に追跡したり書き込んだりする必要はありません。

短所:

  • それは特に重い負荷の下で、非常に非効率的である可能性があります。
11

...この回答を参照してください。

まず、カスタムタイプのストアドプロシージャより

CREATE TYPE Array AS table (Item varchar(MAX)) 

を作成します。

CREATE PROCEDURE sp_TakeArray 
    @array AS Array READONLY 
AS BEGIN 
    Select * from Foo Where ID in (SELECT Item FROM @array) 
END 

次に使用しているデータベース配列

DataTable items = new DataTable(); 
items.Columns.Add("Item", typeof(string)); 

DataRow row = items.NewRow(); 
row.SetField<string>("Item", <item to add>); 
items.Rows.Add(row); 

SqlCommand command = new SqlCommand("sp_TakeArray", connection); 
command.CommandType = CommandType.StoredProcedure; 
SqlParameter param = command.Parameters.Add("@Array", SqlDbType.Structured); 
param.Value = items; 
param.TypeName = "dbo.Array"; 

SqlDataReader reader = command.ExecuteReader(); 
+0

これはSQL Server 2008にのみ適用されます。 –