sql >> Databasteknik >  >> RDS >> Sqlserver

Hur infogar man flera rader i SQL med hjälp av lagrade procedurer?

I SQL Server 2008+ finns det enklare sätt att infoga flera rader i en enda sats. Till exempel är denna syntax giltig:

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

Ovanstående kommer att infoga tre rader. På äldre versioner kan du göra lite mer utförliga saker som:

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

Naturligtvis din ExecuteNonQuery behöver inte vara ett enda kommando, du kan skicka detta som en enda sträng och det kommer fortfarande att fungera:

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

Om du vill göra detta i en lagrad procedur kan du enkelt utföra en split på parametrar med flera värden, till exempel om du skickar in följande sträng:

1,2;2,3;3,4

Du kan bearbeta dessa värden med en funktion som den jag postade här:

Dela värdepar och en skapatabell med UDF

Så din procedur kan se ut så här:

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

Och du skulle kalla det med C#-motsvarigheten till:

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

Eller så kan du använda tabellvärdade parametrar som föreslagits av Alexey. Ett snabbt exempel:

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

Sedan kan du skapa en procedur:

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

Skapa sedan motsvarande TVP i din C#-kod (jag är inte killen du vill göra det; du kan se en exempel här ).

Men det finns några varningar, titta på den här frågan:

Skapa en generaliserad typ för användning som en tabellvärdesparameter



  1. skicka data till MySQL med AJAX + jQuery + PHP

  2. MySql varchar ändring från Latin1 till UTF8

  3. TOAD ansluter trots att db-namnet inte finns i tnsnames.ora

  4. Hur utför man en radlåsning?