Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie fügt man mehrere Zeilen in SQL mit gespeicherten Prozeduren ein?

In SQL Server 2008+ gibt es einfachere Möglichkeiten, mehrere Zeilen in eine einzelne Anweisung einzufügen. Beispielsweise ist diese Syntax gültig:

INSERT dbo.table(col1, col2) VALUES
    (1, 2),
    (2, 3),
    (3, 4);

Das Obige fügt drei Zeilen ein. In älteren Versionen können Sie etwas ausführlichere Dinge tun, wie zum Beispiel:

INSERT dbo.table(col1, col2)
 SELECT 1, 2
  UNION ALL SELECT 2, 3
  UNION ALL SELECT 3, 4;

Natürlich Ihr ExecuteNonQuery muss kein einzelner Befehl sein, Sie können dies als einzelnen String übergeben und es wird trotzdem funktionieren:

INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);

Wenn Sie dies in einer gespeicherten Prozedur tun möchten, können Sie einfach eine Aufteilung auf mehrwertige Parameter durchführen, indem Sie beispielsweise die folgende Zeichenfolge übergeben:

1,2;2,3;3,4

Sie könnten diese Werte mit einer Funktion verarbeiten, wie ich sie hier gepostet habe:

Teilen Sie Wertepaare und erstellen Sie eine Tabelle mit UDF

Ihre Prozedur könnte also so aussehen:

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

Und Sie würden es mit dem C#-Äquivalent von:

aufrufen
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';

Oder Sie könnten Tabellenwertparameter verwenden, wie von Alexey vorgeschlagen. Ein kurzes Beispiel:

CREATE TYPE OrderLineItem AS TABLE
(
  Product INT,
  Quantity INT
);

Dann können Sie eine Prozedur erstellen:

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

Erstellen Sie dann das entsprechende TVP in Ihrem C#-Code (ich bin nicht der Typ, der das tun soll; Sie können einen Beispiel hier ).

Es gibt jedoch einige Vorbehalte, bitte sehen Sie sich diese Frage an:

Erstellen eines generalisierten Typ zur Verwendung als Tabellenwertparameter