sql >> Databáze >  >> RDS >> Sqlserver

Jaký je optimální způsob získávání záznamů z databáze ve scénáři, kdy musíte předat seznamy, z nichž každý má více než 2000 parametrů?

Parametry s hodnotou tabulky jsou správnou cestou, pokud je to skutečně způsob, jakým potřebujete k tomuto tématu přistupovat.

  • Nejprve přepněte na uloženou proceduru, protože používáte SQL 2008 nebo novější.
  • Zadruhé si přečtěte using výpis pro likvidaci položek yoursql.

Psuedo datová vrstva:

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

Vytvořte tvp:

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

)

Vytvořte uložený 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

Pokud potřebujete přidat druhou sadu číselných parametrů, můžete do databáze předat více parametrů různých typů. V minulosti jsme vytvořili několik obecných typů pro podporu různých seznamů datových typů, místo abychom museli spravovat velké množství typů tabulek.

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

Důležité věci k zapamatování:

  • Typ parametru pro tvp musí být SqlDbType.Structured
  • TypeName pro parametr se musí shodovat s názvem Table Value Parametertype.
  • Parametr Table Value Parameter v uložené proceduře musí být deklarován jako READONLY



  1. Nelze zpracovat dotaz MySQL FULL JOIN

  2. sql dotaz pro výpočet součtu a přidání součtu z předchozích řádků

  3. Jak generovat řádky pro časové období podle klíče

  4. jak přeskočit špatný řádek ve zdroji plochého souboru ssis