sql >> Databáze >  >> RDS >> Sqlserver

Jak vložit více řádků do SQL pomocí uložených procedur?

V SQL Server 2008+ existují jednodušší způsoby, jak vložit více řádků do jednoho příkazu. Například tato syntaxe je platná:

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

Výše uvedené vloží tři řádky. Na starších verzích můžete dělat trochu podrobnější věci, jako například:

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

Samozřejmě váš ExecuteNonQuery nemusí to být jeden příkaz, můžete to předat jako jeden řetězec a stále to bude fungovat:

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

Pokud to chcete provést v uložené proceduře, můžete snadno provést rozdělení na vícehodnotových parametrech, například pokud předáte následující řetězec:

1,2;2,3;3,4

Tyto hodnoty můžete zpracovat pomocí funkce, jako je ta, kterou jsem zde zveřejnil:

Rozdělit páry hodnot a vytvořit tabulku pomocí UDF

Váš postup tedy může vypadat takto:

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

A nazvali byste to pomocí ekvivalentu C#:

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

Nebo můžete použít parametry s tabulkovou hodnotou, jak navrhuje Alexey. Rychlý příklad:

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

Poté můžete vytvořit proceduru:

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

Poté vytvořte ekvivalentní TVP ve svém kódu C# (nejsem ten, koho to chcete udělat; můžete vidět příklad zde ).

Existují však určitá upozornění, podívejte se prosím na tuto otázku:

Vytvoření zobecněného typ pro použití jako parametr hodnoty tabulky



  1. Jazykový překlad gramatiky

  2. VYBERTE rodiče záznamu

  3. Funkce MySQL Max míchání řádků

  4. joomla 1.5.22 na mysql 5.5