I SQL Server 2008+ er der nemmere måder at indsætte flere rækker i en enkelt sætning. For eksempel er denne syntaks gyldig:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Ovenstående vil indsætte tre rækker. På ældre versioner kan du gøre lidt mere udførlige ting såsom:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Selvfølgelig din ExecuteNonQuery
behøver ikke at være en enkelt kommando, du kan sende dette som en enkelt streng, og det vil stadig fungere:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Hvis du ønsker at gøre dette i en lagret procedure, kan du nemt udføre en opdeling på parametre med flere værdier, for eksempel hvis du sender følgende streng:
1,2;2,3;3,4
Du kan behandle disse værdier ved hjælp af en funktion som den, jeg postede her:
Opdel værdipar og en oprettelsestabel ved hjælp af UDF
Så din procedure kan se sådan ud:
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
Og du ville kalde det ved at bruge C#-ækvivalenten til:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Eller du kan bruge tabelværdiparametre som foreslået af Alexey. Et hurtigt eksempel:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Derefter kan du oprette en procedure:
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
Opret derefter den tilsvarende TVP i din C#-kode (jeg er ikke den fyr, du vil gøre det; du kan se en eksempel her ).
Der er dog nogle forbehold, se venligst på dette spørgsmål:
Oprettelse af en generaliseret type til brug som en tabelværdiparameter