Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa cara optimal untuk mendapatkan catatan dari database dalam skenario bahwa Anda harus melewati daftar yang masing-masing memiliki lebih dari 2000 parameter?

Parameter bernilai tabel adalah cara yang harus dilakukan jika memang ini cara yang Anda perlukan untuk mendekati topik ini.

  • Pertama, alihkan ke prosedur tersimpan karena Anda menggunakan SQL 2008 atau yang lebih baru.
  • Kedua, baca tentang using pernyataan untuk membuang item sql Anda.

Lapisan data palsu:

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;
}

Buat tvpnya:

CREATE TYPE [dbo].[tvpItems] AS TABLE(
[ItemNumber] [int] NULL

)

Buat proc yang tersimpan:

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

Jika Anda perlu menambahkan set kedua parameter angka, maka Anda dapat meneruskan beberapa parameter dari jenis yang berbeda ke database. Di masa lalu, kami telah membuat beberapa tipe generik untuk mendukung berbagai daftar tipe data daripada harus mengelola banyak tipe tabel.

CREATE TYPE [dbo].[IntList] AS TABLE(
    [Value] [Int] NULL
)

Hal-hal penting untuk diingat:

  • Tipe parameter untuk tvp harus SqlDbType.Structured
  • TypeName untuk parameternya harus cocok dengan nama Table Value Parametertype.
  • Parameter Parameter Nilai Tabel dalam prosedur tersimpan harus dideklarasikan sebagai 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. Cara menulis kueri SQL untuk menyajikan nilai secara horizontal

  2. tidak dapat memberikan nilai sebagai float

  3. CHECKSUM dan CHECKSUM_AGG:Apa algoritmanya?

  4. Tidak dapat melakukan ORDERBY terhadap data EF4 saya

  5. Daftarkan Nama Server baru di Sql Management Studio