Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jaki jest optymalny sposób pozyskiwania rekordów z bazy danych w scenariuszu, w którym musisz przekazać listy, że każda z nich ma więcej niż 2000 parametrów?

Parametry wartości tabeli to droga do zrobienia, jeśli rzeczywiście jest to sposób, w jaki należy podejść do tego tematu.

  • Najpierw przełącz się na procedurę składowaną, ponieważ używasz SQL 2008 lub nowszego.
  • Po drugie, przeczytaj using oświadczenie o pozbyciu się Twoich elementów SQL.

Pseudonimowa warstwa danych:

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

Utwórz telewizor:

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

)

Utwórz zapisany proces:

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

Jeśli musisz dodać drugi zestaw parametrów liczbowych, możesz przekazać do bazy danych wiele parametrów różnych typów. W przeszłości stworzyliśmy kilka typów ogólnych do obsługi różnych list typów danych zamiast konieczności zarządzania wieloma typami tabel.

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

Ważne rzeczy do zapamiętania:

  • Typ parametru dla telewizora musi być SqlDbType.Structured
  • TypeName parametr musi być zgodny z nazwą typu parametru wartości tabeli.
  • Parametr wartości tabeli w procedurze składowanej musi być zadeklarowany jako 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. Tworzenie procedury składowanej za pomocą C#

  2. Znajdź wartości nieliczbowe w kolumnie w SQL Server

  3. Praca z danymi Salesforce.com w usługach raportowania SQL Server

  4. Zapytanie o pomoc podczas korzystania z tabeli audytu

  5. krzyżowe zapytanie xml działa wykładniczo gorzej wraz ze wzrostem dokumentu xml