Các tham số có giá trị trong bảng là cách để đi nếu đây thực sự là cách bạn cần để tiếp cận chủ đề này.
- Đầu tiên, hãy chuyển sang một thủ tục được lưu trữ vì bạn đang sử dụng SQL 2008 ornewer.
- Thứ hai, đọc
using
tuyên bố về việc loại bỏ các mụcql của bạn.
Lớp dữ liệu Psuedo:
public List<SalesList> ExecuteSales(List<string> items, int storeID, int W1, int W2, int vendorID, int retailerID)
{
var sales = new List<SalesList>();
var table = new DataTable();
table.Columns.Add("ItemNumber");
foreach (var item in items)
{
table.Rows.Add(item);
}
using (var connection = new SqlConnection("ConnectionString"))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "cp_ExecuteSales";
command.Parameters.AddWithValue("@RetailerID", retailerID);
command.Parameters.AddWithValue("@VendorID", vendorID);
command.Parameters.AddWithValue("@StoreID", storeID);
var tvp = new SqlParameter("@ItemIds", SqlDbType.Structured)
{
TypeName = "tvpItems",
Value = table
};
command.Parameters.Add(tvp);
using (var reader = command.ExecuteReader())
{
//DoWork
}
}
}
return sales;
}
Tạo tvp:
CREATE TYPE [dbo].[tvpItems] AS TABLE(
[ItemNumber] [int] NULL
)
Tạo proc được lưu trữ:
CREATE PROCEDURE cp_ExecuteSales
@RetailerID VARCHAR(50),
@VendorID VARCHAR(50),
@StoreID VARCHAR(50),
@ItemIds tvpItems READONLY
AS
SELECT I.ITEM_NBR
,I.ITEM_DESC1
,I.ITEM_DESC2
,I.VENDOR_STK_NBR
,SUM(SA.POS_QTY) AS POS_QTY
,SUM(SA.POS_SALES) AS POS_SALES
FROM SALES_FTBL SA
INNER JOIN ITEM_TBL I ON SA.RETAILER_ID = I.RETAILER_ID
AND SA.ITEM_NBR = I.ITEM_NBR
INNER JOIN @ItemIds ID ON SA.ITEM_NBR = ID.ItemNumber
WHERE SA.RETAILER_ID=I.RETAILER_ID
AND SA.RETAILER_ID = @RetailerID
AND SA.VENDOR_NBR = @VendorID
AND SA.STORE_NBR = @StoreID
AND SA.ITEM_NBR=I.ITEM_NBR
Nếu bạn cần thêm bộ tham số số thứ hai, thì bạn có thể chuyển nhiều tham số thuộc các kiểu khác nhau vào cơ sở dữ liệu. Trước đây, chúng tôi đã tạo một số kiểu chung để hỗ trợ danh sách các kiểu dữ liệu khác nhau thay vì phải quản lý nhiều loại bảng.
CREATE TYPE [dbo].[IntList] AS TABLE(
[Value] [Int] NULL
)
Những điều quan trọng cần nhớ:
- Loại tham số cho tvp phải là
SqlDbType.Structured
-
TypeName
đối với tham số phải khớp với tên loại Tham số giá trị bảng. - Tham số Tham số Giá trị Bảng trong quy trình được lưu trữ phải được khai báo dưới dạng
READONLY