SQL Server 2008 (hoặc mới hơn)
Đầu tiên, trong cơ sở dữ liệu của bạn, tạo hai đối tượng sau:
CREATE TYPE dbo.IDList
AS TABLE
(
ID INT
);
GO
CREATE PROCEDURE dbo.DoSomethingWithEmployees
@List AS dbo.IDList READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT ID FROM @List;
END
GO
Bây giờ trong mã C # của bạn:
// Obtain your list of ids to send, this is just an example call to a helper utility function
int[] employeeIds = GetEmployeeIds();
DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("ID", typeof(int)));
// populate DataTable from your List here
foreach(var id in employeeIds)
tvp.Rows.Add(id);
using (conn)
{
SqlCommand cmd = new SqlCommand("dbo.DoSomethingWithEmployees", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp);
// these next lines are important to map the C# DataTable object to the correct SQL User Defined Type
tvparam.SqlDbType = SqlDbType.Structured;
tvparam.TypeName = "dbo.IDList";
// execute query, consume results, etc. here
}
Máy chủ SQL 2005
Nếu bạn đang sử dụng SQL Server 2005, tôi vẫn sẽ đề xuất một hàm phân tách trên XML. Đầu tiên, tạo một hàm:
CREATE FUNCTION dbo.SplitInts
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
RETURN ( SELECT Item = CONVERT(INT, Item) FROM
( SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
FROM ( SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
WHERE Item IS NOT NULL
);
GO
Bây giờ thủ tục lưu trữ của bạn chỉ có thể là:
CREATE PROCEDURE dbo.DoSomethingWithEmployees
@List VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT EmployeeID = Item FROM dbo.SplitInts(@List, ',');
END
GO
Và trong mã C # của bạn, bạn chỉ cần vượt qua danh sách là '1,2,3,12'
...
Tôi thấy phương pháp chuyển qua các tham số có giá trị của bảng đơn giản hóa khả năng duy trì của một giải pháp sử dụng nó và thường có hiệu suất tăng so với các triển khai khác bao gồm tách XML và tách chuỗi.
Các đầu vào được xác định rõ ràng (không ai phải đoán xem dấu phân cách là dấu phẩy hay dấu chấm phẩy) và chúng tôi không phụ thuộc vào các hàm xử lý khác không rõ ràng mà không kiểm tra mã cho quy trình được lưu trữ.
So với các giải pháp liên quan đến lược đồ XML do người dùng xác định thay vì UDT, điều này bao gồm một số bước tương tự nhưng theo kinh nghiệm của tôi là mã đơn giản hơn nhiều để quản lý, duy trì và đọc.
Trong nhiều giải pháp, bạn có thể chỉ cần một hoặc một vài trong số các UDT này (Loại do người dùng xác định) mà bạn sử dụng lại cho nhiều quy trình được lưu trữ. Như với ví dụ này, yêu cầu chung là thông qua danh sách các con trỏ ID, tên hàm mô tả bối cảnh mà các Id đó sẽ đại diện, tên loại nên chung chung.