В SQL Server 2008+ существуют более простые способы вставки нескольких строк в один оператор. Например, этот синтаксис действителен:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Выше будет вставлено три строки. В старых версиях вы можете сделать несколько более подробные вещи, такие как:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Конечно, ваша ExecuteNonQuery
не обязательно должна быть одной командой, вы можете передать ее как одну строку, и она все равно будет работать:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Если вы хотите сделать это в хранимой процедуре, вы можете легко выполнить разбиение по многозначным параметрам, например, если вы передадите следующую строку:
1,2;2,3;3,4
Вы можете обработать эти значения, используя функцию, подобную той, которую я разместил здесь:
Разделение пар значений и создание таблицы с использованием UDF
Итак, ваша процедура может выглядеть так:
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
И вы бы назвали это используя эквивалент C #:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Или вы можете использовать табличные параметры, как это предложил Алексей. Быстрый пример:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Затем вы можете создать процедуру:
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
Затем создайте эквивалентный TVP в своем коде C # (я не тот парень, которому вы хотите это делать; вы можете увидеть пример здесь ).
Однако есть некоторые предостережения, пожалуйста, посмотрите на этот вопрос:
Создание обобщенного типа для использования в качестве параметра табличного значения