I SQL Server 2008+ finns det enklare sätt att infoga flera rader i en enda sats. Till exempel är denna syntax giltig:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Ovanstående kommer att infoga tre rader. På äldre versioner kan du göra lite mer utförliga saker som:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Naturligtvis din ExecuteNonQuery
behöver inte vara ett enda kommando, du kan skicka detta som en enda sträng och det kommer fortfarande att fungera:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Om du vill göra detta i en lagrad procedur kan du enkelt utföra en split på parametrar med flera värden, till exempel om du skickar in följande sträng:
1,2;2,3;3,4
Du kan bearbeta dessa värden med en funktion som den jag postade här:
Dela värdepar och en skapatabell med UDF
Så din procedur kan se ut så här:
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
Och du skulle kalla det med C#-motsvarigheten till:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Eller så kan du använda tabellvärdade parametrar som föreslagits av Alexey. Ett snabbt exempel:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Sedan kan du skapa en procedur:
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
Skapa sedan motsvarande TVP i din C#-kod (jag är inte killen du vill göra det; du kan se en exempel här ).
Men det finns några varningar, titta på den här frågan:
Skapa en generaliserad typ för användning som en tabellvärdesparameter