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