sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo insertar varias filas en SQL usando procedimientos almacenados?

En SQL Server 2008+ hay formas más sencillas de insertar varias filas en una sola instrucción. Por ejemplo, esta sintaxis es válida:

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

Lo anterior insertará tres filas. En versiones anteriores, puede hacer cosas un poco más detalladas, como:

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

Por supuesto, su ExecuteNonQuery no tiene que ser un solo comando, puede pasarlo como una sola cadena y seguirá funcionando:

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

Si desea hacer esto en un procedimiento almacenado, puede realizar fácilmente una división en parámetros de varios valores, por ejemplo, si pasa la siguiente cadena:

1,2;2,3;3,4

Podrías procesar esos valores usando una función como la que publiqué aquí:

Dividir pares de valores y crear una tabla usando UDF

Así que su procedimiento podría verse así:

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

Y lo llamarías usando el equivalente en C# de:

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

O podría usar parámetros con valores de tabla como lo sugiere Alexey. Un ejemplo rápido:

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

Luego puede crear un procedimiento:

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

Luego crea el TVP equivalente en tu código C# (no soy el tipo que quieres que haga eso; puedes ver un ejemplo aquí ).

Sin embargo, hay algunas advertencias, consulte esta pregunta:

Crear un parámetro generalizado escriba para usar como un parámetro de valor de tabla