In SQL Server 2008+ esistono modi più semplici per inserire più righe in una singola istruzione. Ad esempio questa sintassi è valida:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Quanto sopra inserirà tre righe. Nelle versioni precedenti puoi fare cose leggermente più dettagliate come:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Ovviamente il tuo ExecuteNonQuery
non deve essere un singolo comando, puoi passarlo come una singola stringa e funzionerà ancora:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Se vuoi farlo in una procedura memorizzata, puoi facilmente eseguire una suddivisione su parametri multivalore, ad esempio se passi la seguente stringa:
1,2;2,3;3,4
Potresti elaborare quei valori usando una funzione come quella che ho pubblicato qui:
Dividi coppie di valori e una tabella di creazione utilizzando UDF
Quindi la tua procedura potrebbe assomigliare a questa:
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
E lo chiamereste usando l'equivalente C# di:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Oppure potresti usare parametri con valori di tabella come suggerito da Alexey. Un rapido esempio:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Quindi puoi creare una procedura:
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
Quindi crea il TVP equivalente nel tuo codice C# (non sono il ragazzo che vuoi fare; puoi vedere un esempio qui ).
Tuttavia ci sono alcuni avvertimenti, per favore guarda questa domanda:
Creazione di un parametro generalizzato tipo da utilizzare come parametro di valore di tabella