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

Come inserire più righe in SQL utilizzando le procedure memorizzate?

In SQL Server 2008+ esistono modi più semplici per inserire più righe in una singola istruzione. Ad esempio questa sintassi è valida:

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

Quanto sopra inserirà tre righe. Nelle versioni precedenti puoi fare cose leggermente più dettagliate come:

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

Ovviamente il tuo ExecuteNonQuery non deve essere un singolo comando, puoi passarlo come una singola stringa e funzionerà ancora:

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

Se vuoi farlo in una procedura memorizzata, puoi facilmente eseguire una suddivisione su parametri multivalore, ad esempio se passi la seguente stringa:

1,2;2,3;3,4

Potresti elaborare quei valori usando una funzione come quella che ho pubblicato qui:

Dividi coppie di valori e una tabella di creazione utilizzando UDF

Quindi la tua procedura potrebbe assomigliare a questa:

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

E lo chiamereste usando l'equivalente C# di:

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

Oppure potresti usare parametri con valori di tabella come suggerito da Alexey. Un rapido esempio:

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

Quindi puoi creare una procedura:

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

Quindi crea il TVP equivalente nel tuo codice C# (non sono il ragazzo che vuoi fare; puoi vedere un esempio qui ).

Tuttavia ci sono alcuni avvertimenti, per favore guarda questa domanda:

Creazione di un parametro generalizzato tipo da utilizzare come parametro di valore di tabella