Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment insérer plusieurs lignes dans SQL à l'aide de procédures stockées ?

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