In SQL Server 2008+ zijn er eenvoudigere manieren om meerdere rijen in een enkele instructie in te voegen. Deze syntaxis is bijvoorbeeld geldig:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Het bovenstaande voegt drie rijen in. Op oudere versies kunt u iets uitgebreidere dingen doen, zoals:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Natuurlijk uw ExecuteNonQuery
hoeft geen enkel commando te zijn, je kunt dit als een enkele string doorgeven en het zal nog steeds werken:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Als u dit in een opgeslagen procedure wilt doen, kunt u eenvoudig een splitsing uitvoeren op parameters met meerdere waarden, bijvoorbeeld als u de volgende tekenreeks doorgeeft:
1,2;2,3;3,4
Je zou die waarden kunnen verwerken met een functie zoals die ik hier heb gepost:
Waardeparen splitsen en een tabel maken UDF gebruiken
Uw procedure kan er dus als volgt uitzien:
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
En je zou het noemen met het C#-equivalent van:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Of u kunt parameters met tabelwaarde gebruiken, zoals voorgesteld door Alexey. Een snel voorbeeld:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Dan kun je een procedure aanmaken:
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
Maak vervolgens de equivalente TVP in uw C#-code (ik ben niet degene die u dat wilt doen; u kunt een voorbeeld hier ).
Er zijn echter enkele kanttekeningen, kijk alstublieft naar deze vraag:
Een gegeneraliseerde type voor gebruik als tabelwaardeparameter