Dans SQL Server 2008+, il existe des moyens plus simples d'insérer plusieurs lignes dans une seule instruction. Par exemple cette syntaxe est valide :
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Ce qui précède insérera trois lignes. Sur les anciennes versions, vous pouvez faire des choses un peu plus détaillées telles que :
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Bien sûr, votre ExecuteNonQuery
n'a pas besoin d'être une seule commande, vous pouvez la transmettre comme une seule chaîne et cela fonctionnera toujours :
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Si vous souhaitez le faire dans une procédure stockée, vous pouvez facilement effectuer un fractionnement sur des paramètres à valeurs multiples, par exemple si vous transmettez la chaîne suivante :
1,2;2,3;3,4
Vous pouvez traiter ces valeurs en utilisant une fonction comme celle que j'ai postée ici :
Diviser des paires de valeurs et créer une table en utilisant UDF
Votre procédure pourrait donc ressembler à ceci :
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
Et vous l'appelleriez en utilisant l'équivalent C# de :
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Ou vous pouvez utiliser des paramètres de table comme suggéré par Alexey. Un exemple rapide :
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Ensuite, vous pouvez créer une procédure :
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
Créez ensuite le TVP équivalent dans votre code C # (je ne suis pas le gars que vous voulez faire; vous pouvez voir un exemple ici ).
Cependant, il y a quelques mises en garde, veuillez regarder cette question :
Création d'un paramètre généralisé type à utiliser comme paramètre de valeur de table