Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tối ưu để lấy các bản ghi từ cơ sở dữ liệu trong trường hợp bạn phải chuyển các danh sách mà mỗi danh sách trong số chúng có hơn 2000 tham số là gì?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xóa các bản ghi KHÔNG VÀO

  2. Lập trình tạo tập lệnh cho tất cả các đối tượng trong cơ sở dữ liệu

  3. ExecuteNonQuery () cho Chèn

  4. Làm cách nào để giảm kích thước tệp nhật ký máy chủ sql của tôi?

  5. Sử dụng RAISERROR không hoạt động trong SQL Server 2005?