Giả sử SQL Server 2008 hoặc mới hơn, trong SQL Server, hãy tạo một loại bảng một lần:
CREATE TYPE dbo.ColumnBValues AS TABLE
(
ColumnB INT
);
Sau đó, một thủ tục được lưu trữ có kiểu như vậy làm đầu vào:
CREATE PROCEDURE dbo.whatever
@ColumnBValues dbo.ColumnBValues READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT A.* FROM dbo.TableA AS A
INNER JOIN @ColumnBValues AS c
ON A.ColumnB = c.ColumnB;
END
GO
Bây giờ trong C #, hãy tạo DataTable và chuyển nó làm tham số cho thủ tục được lưu trữ:
DataTable cbv = new DataTable();
cbv.Columns.Add(new DataColumn("ColumnB"));
// in a loop from a collection, presumably:
cbv.Rows.Add(someThing.someValue);
using (connectionObject)
{
SqlCommand cmd = new SqlCommand("dbo.whatever", connectionObject);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter cbvParam = cmd.Parameters.AddWithValue("@ColumnBValues", cbv);
cbvParam.SqlDbType = SqlDbType.Structured;
//cmd.Execute...;
}
(Bạn có thể muốn làm cho loại này chung chung hơn, tôi đã đặt tên cụ thể để làm rõ nó đang làm gì.)