В 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# код (аз не съм човекът, който искате да правите това; можете да видите пример тук ).
Има обаче някои предупреждения, моля, погледнете този въпрос:
Създаване на обобщен тип за използване като параметър на стойност на таблица