2011-12-15 3 views
0

テーブル製品とテーブルオーダーの関係が多岐にわたり、リンクテーブルはProductInOrderです。 プロダクトIDのリストを入力としてストアード・プロシージャーを作成し、そのプロジェクトIDを使用してストアード・プロシージャーを作成すると、新しいオーダーが作成され、製品ごとにリンク・テーブルに新しいレコードが追加されます。ストアドプロシージャ内の複数の挿入

これで、クライアントが開始したトランザクションを使用してspを呼び出し、新しいオーダーを作成してから、リンクテーブルの各レコードを作成するspを呼び出すループをクライアントで呼び出しました。 しかし、SQLでこれを行う方法が必要です。

アイデア?何がしたいこと(MSSQLのための、少なくとも)このようなものである

ベスト

+3

あなたはどのようにクエリを書くかを尋ねていますが、使用しているRDBMS(Oracle、MySQL、SQL Server、PostGreSQL、SQLite ...)とそのRDBMSのバージョンがわからないと答えにくいです。 SQLの実装は異なります。たとえば、クエリの効率を向上させるために使用できる機能があります。また、SQL構文もさまざまです。 – Benoit

+0

@Benoitまた、すべてのクライアントが特定のRDBMSのすべての機能を利用できるわけではないので、ここのクライアントも重要です。 –

+0

私はC#とMSSQLを使用していますが、実際のアプリケーションではありません。 – BCartolo

答えて

1

declare @Sql varchar(max) = ' 
insert into ProductInOrder (OrderID, ProductID) 
select 
    ' + @OrderID + ', 
    ProductID 
from 
    Product 
where 
    ProductID in (' + @Products + ')' 

sp_executesql(@Sql) 

@Productsの整数をカンマで区切った文字列、e.g.- '1,2,3,15,100'としてインチ

C#で一時テーブルをアップロードするには、この操作を行うと思います(使用してSqlCommand命名comm):

comm.CommandText = "create table #ProductList (ProductID int)"; 
comm.ExecuteNonQuery(); 
comm.CommandText = "insert into #ProductList (ProductID) values (@ProductID)"; 
foreach(int product in products) 
{ 
    comm.Parameters.Clear(); 
    comm.Parameters.AddWithValue("@ProductID", product); 
    comm.ExecuteNonQuery(); 
} 
comm.Parameters.Clear(); 
comm.Parameters.AddWithValue("@OrderID", orderId); 
comm.CommandText = "insert into ProductInOrder (OrderID, ProductID) " + 
    "select @OrderID, p.ProductID from Product p inner join #ProductList pl on " + 
     "p.ProductID = pl.ProductID"; 
comm.ExecuteNonQuery(); 
comm.CommandText = "drop table #ProductList"; 
comm.ExecuteNonQuery(); 
+0

それは実際にはかなり良いです。動的SQLを使用せずにこれを行う方法はありませんか? – BCartolo

+0

残念ながら、いいえ。 tempテーブルを読み込んで渡すことができますが、値の配列を直接渡すことはできません。ここに渡すことができる唯一のデータ型は次のとおりです。http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx – Eric

+0

一時テーブルのことは有望ですが、私は例を考え出すことができます。 – BCartolo

0

これは素晴らしく実行し、へのラウンドトリップの数を短縮する別のオプションですサーバーをアプリケーションから削除します。

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

私は。本当に優れたオプションでそれを使用しているシナリオで非常によく行います。 Web上には、私がそれのために実装した私のProof of Concept Iを見つけることができないので、見ることができる例があります。これは、対象とするデータベースにテーブルデータ型を作成する必要があります。

関連する問題