SQL Server 2008 以降では、1 つのステートメントに複数の行を挿入する簡単な方法があります。たとえば、次の構文は有効です:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
上記は3行を挿入します。古いバージョンでは、次のような少し冗長なことを行うことができます:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
もちろん、あなたの ExecuteNonQuery
単一のコマンドである必要はありません。これを単一の文字列として渡すことができ、それでも機能します:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
ストアド プロシージャでこれを行う場合、たとえば次の文字列を渡すと、複数の値を持つパラメーターの分割を簡単に実行できます:
1,2;2,3;3,4
ここに投稿したような関数を使用して、これらの値を処理できます:
したがって、手順は次のようになります。
CREATE PROCEDURE dbo.AddOrderLineItems
@LineItems VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.OrderItems(Product, Quantity)
SELECT Product, Quantity FROM dbo.MultiSplit(@LineItems);
END
GO
そして、次の C# に相当するものを使用して呼び出します:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
または、Alexey が提案するように、テーブル値パラメーターを使用することもできます。簡単な例:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
その後、プロシージャを作成できます:
CREATE PROCEDURE dbo.AddOrderLineItems
@LineItems OrderLineItem READONLY
-- other parameters
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.OrderItems(Product, Quantity)
SELECT Product, Quantity FROM @LineItems;
END
GO
次に、C# コードで同等の TVP を作成します (私はあなたがそうしたい人ではありません。例はこちら ).
ただし、いくつかの注意点があります。次の質問をご覧ください: