sql >> Database >  >> RDS >> Sqlserver

Hoe voeg ik meerdere rijen in SQL in met behulp van opgeslagen procedures?

In SQL Server 2008+ zijn er eenvoudigere manieren om meerdere rijen in een enkele instructie in te voegen. Deze syntaxis is bijvoorbeeld geldig:

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

Het bovenstaande voegt drie rijen in. Op oudere versies kunt u iets uitgebreidere dingen doen, zoals:

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

Natuurlijk uw ExecuteNonQuery hoeft geen enkel commando te zijn, je kunt dit als een enkele string doorgeven en het zal nog steeds werken:

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

Als u dit in een opgeslagen procedure wilt doen, kunt u eenvoudig een splitsing uitvoeren op parameters met meerdere waarden, bijvoorbeeld als u de volgende tekenreeks doorgeeft:

1,2;2,3;3,4

Je zou die waarden kunnen verwerken met een functie zoals die ik hier heb gepost:

Waardeparen splitsen en een tabel maken UDF gebruiken

Uw procedure kan er dus als volgt uitzien:

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

En je zou het noemen met het C#-equivalent van:

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

Of u kunt parameters met tabelwaarde gebruiken, zoals voorgesteld door Alexey. Een snel voorbeeld:

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

Dan kun je een procedure aanmaken:

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

Maak vervolgens de equivalente TVP in uw C#-code (ik ben niet degene die u dat wilt doen; u kunt een voorbeeld hier ).

Er zijn echter enkele kanttekeningen, kijk alstublieft naar deze vraag:

Een gegeneraliseerde type voor gebruik als tabelwaardeparameter



  1. Hoe rijen in een tabel te tellen op basis van een andere tabel in mysql

  2. Oracle:SQL-query die rijen retourneert met alleen numerieke waarden

  3. Verwijder schuine strepen in node js mysql-query

  4. Callablestatement-fout:ontbrekende IN- of OUT-parameter bij index::1