Trong SQL Server 2008+, có nhiều cách dễ dàng hơn để chèn nhiều hàng trong một câu lệnh. Ví dụ:cú pháp này hợp lệ:
INSERT dbo.table(col1, col2) VALUES
(1, 2),
(2, 3),
(3, 4);
Ở trên sẽ chèn ba hàng. Trên các phiên bản cũ hơn, bạn có thể làm những việc dài dòng hơn một chút, chẳng hạn như:
INSERT dbo.table(col1, col2)
SELECT 1, 2
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4;
Tất nhiên ExecuteNonQuery
của bạn không nhất thiết phải là một lệnh duy nhất, bạn có thể chuyển nó dưới dạng một chuỗi duy nhất và nó sẽ vẫn hoạt động:
INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);
Nếu bạn muốn thực hiện việc này trong một thủ tục được lưu trữ, bạn có thể dễ dàng thực hiện tách trên các tham số nhiều giá trị, ví dụ:nếu bạn chuyển vào chuỗi sau:
1,2;2,3;3,4
Bạn có thể xử lý các giá trị đó bằng cách sử dụng một hàm như hàm mà tôi đã đăng ở đây:
Tách các cặp giá trị và tạo bảng sử dụng UDF
Vì vậy, thủ tục của bạn có thể giống như sau:
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
Và bạn sẽ gọi nó bằng cách sử dụng C # tương đương với:
EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Hoặc bạn có thể sử dụng các tham số có giá trị bảng theo đề xuất của Alexey. Một ví dụ nhanh:
CREATE TYPE OrderLineItem AS TABLE
(
Product INT,
Quantity INT
);
Sau đó, bạn có thể tạo một thủ tục:
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
Sau đó, tạo TVP tương đương trong mã C # của bạn (Tôi không phải là người bạn muốn làm điều đó; bạn có thể thấy ví dụ ở đây ).
Tuy nhiên, có một số lưu ý, vui lòng xem câu hỏi này:
Tạo tổng quát nhập để sử dụng làm tham số giá trị bảng