Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wstawić wiele wierszy w SQL za pomocą procedur składowanych?

W SQL Server 2008+ istnieją łatwiejsze sposoby wstawiania wielu wierszy w jednej instrukcji. Na przykład ta składnia jest prawidłowa:

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

Powyższe wstawi trzy wiersze. W starszych wersjach możesz robić nieco bardziej szczegółowe rzeczy, takie jak:

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

Oczywiście Twój ExecuteNonQuery nie musi być pojedynczym poleceniem, możesz przekazać to jako pojedynczy ciąg i nadal będzie działać:

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

Jeśli chcesz to zrobić w procedurze składowanej, możesz łatwo przeprowadzić podział na parametrach wielowartościowych, na przykład, jeśli przekażesz następujący ciąg:

1,2;2,3;3,4

Możesz przetworzyć te wartości za pomocą funkcji takiej jak ta, którą tutaj zamieściłem:

Podziel pary wartości i utwórz tabelę za pomocą UDF

Twoja procedura może wyglądać tak:

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

Można to nazwać za pomocą odpowiednika w C#:

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

Lub możesz użyć parametrów wycenianych w tabeli, zgodnie z sugestią Alexeya. Szybki przykład:

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

Następnie możesz utworzyć 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

Następnie utwórz odpowiednik TVP w swoim kodzie C# (nie jestem tym, który chcesz to robić; możesz zobaczyć przykład tutaj ).

Istnieją jednak pewne zastrzeżenia, spójrz na to pytanie:

Tworzenie uogólnionej wpisz do użycia jako parametr wartości tabeli



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ExecuteNonQuery() dla wstawiania

  2. Przywracanie dostępu do instancji SQL Server bez ponownego uruchamiania

  3. SQL Server:wiersz obecny w jednym zapytaniu, brak w innym

  4. Sumuj z SQL server RollUP - ale tylko ostatnie podsumowanie?

  5. Jak wydrukować GETDATE() w SQL Server z milisekundami w czasie?