W SQL Server 2008+ istnieją łatwiejsze sposoby wstawiania wielu wierszy w jednej instrukcji. Na przykład ta składnia jest prawidłowa:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Powyższe wstawi trzy wiersze. W starszych wersjach możesz robić nieco bardziej szczegółowe rzeczy, takie jak:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Oczywiście Twój ExecuteNonQuery
nie musi być pojedynczym poleceniem, możesz przekazać to jako pojedynczy ciąg i nadal będzie działać:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Jeśli chcesz to zrobić w procedurze składowanej, możesz łatwo przeprowadzić podział na parametrach wielowartościowych, na przykład, jeśli przekażesz następujący ciąg:
1,2;2,3;3,4
Możesz przetworzyć te wartości za pomocą funkcji takiej jak ta, którą tutaj zamieściłem:
Podziel pary wartości i utwórz tabelę za pomocą UDF
Twoja procedura może wyglądać tak:
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
Można to nazwać za pomocą odpowiednika w C#:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Lub możesz użyć parametrów wycenianych w tabeli, zgodnie z sugestią Alexeya. Szybki przykład:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Następnie możesz utworzyć 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
Następnie utwórz odpowiednik TVP w swoim kodzie C# (nie jestem tym, który chcesz to robić; możesz zobaczyć przykład tutaj ).
Istnieją jednak pewne zastrzeżenia, spójrz na to pytanie:
Tworzenie uogólnionej wpisz do użycia jako parametr wartości tabeli