V SQL Server 2008+ existují jednodušší způsoby, jak vložit více řádků do jednoho příkazu. Například tato syntaxe je platná:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Výše uvedené vloží tři řádky. Na starších verzích můžete dělat trochu podrobnější věci, jako například:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Samozřejmě váš ExecuteNonQuery
nemusí to být jeden příkaz, můžete to předat jako jeden řetězec a stále to bude fungovat:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Pokud to chcete provést v uložené proceduře, můžete snadno provést rozdělení na vícehodnotových parametrech, například pokud předáte následující řetězec:
1,2;2,3;3,4
Tyto hodnoty můžete zpracovat pomocí funkce, jako je ta, kterou jsem zde zveřejnil:
Rozdělit páry hodnot a vytvořit tabulku pomocí UDF
Váš postup tedy může vypadat takto:
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
A nazvali byste to pomocí ekvivalentu C#:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Nebo můžete použít parametry s tabulkovou hodnotou, jak navrhuje Alexey. Rychlý příklad:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Poté můžete vytvořit proceduru:
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
Poté vytvořte ekvivalentní TVP ve svém kódu C# (nejsem ten, koho to chcete udělat; můžete vidět příklad zde ).
Existují však určitá upozornění, podívejte se prosím na tuto otázku:
Vytvoření zobecněného typ pro použití jako parametr hodnoty tabulky