sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan indsætter man flere rækker i SQL ved hjælp af lagrede procedurer?

I SQL Server 2008+ er der nemmere måder at indsætte flere rækker i en enkelt sætning. For eksempel er denne syntaks gyldig:

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

Ovenstående vil indsætte tre rækker. På ældre versioner kan du gøre lidt mere udførlige ting såsom:

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

Selvfølgelig din ExecuteNonQuery behøver ikke at være en enkelt kommando, du kan sende dette som en enkelt streng, og det vil stadig fungere:

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

Hvis du ønsker at gøre dette i en lagret procedure, kan du nemt udføre en opdeling på parametre med flere værdier, for eksempel hvis du sender følgende streng:

1,2;2,3;3,4

Du kan behandle disse værdier ved hjælp af en funktion som den, jeg postede her:

Opdel værdipar og en oprettelsestabel ved hjælp af UDF

Så din procedure kan se sådan ud:

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

Og du ville kalde det ved at bruge C#-ækvivalenten til:

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

Eller du kan bruge tabelværdiparametre som foreslået af Alexey. Et hurtigt eksempel:

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

Derefter kan du oprette en procedure:

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

Opret derefter den tilsvarende TVP i din C#-kode (jeg er ikke den fyr, du vil gøre det; du kan se en eksempel her ).

Der er dog nogle forbehold, se venligst på dette spørgsmål:

Oprettelse af en generaliseret type til brug som en tabelværdiparameter



  1. Jeg forstår ikke hvordan postgresqls nextval() virker, kan nogen forklare?

  2. Hvorfor er usigneret heltal ikke tilgængelig i PostgreSQL?

  3. hvordan man forstår kan ikke forbinde mysql fejlmeddelelser?

  4. Forespørg om sammenligning af datoer i SQL