sql >> Database >  >> RDS >> Sqlserver

Wat is de optimale manier om records uit de database te halen in het scenario dat u lijsten moet doorgeven die elk meer dan 2000 parameters hebben?

Tabel gewaardeerde parameters is de juiste keuze als dit inderdaad de manier is waarop u dit onderwerp moet benaderen.

  • Schakel eerst over naar een opgeslagen procedure aangezien u SQL 2008 of nieuwer gebruikt.
  • Ten tweede, lees de using verklaring voor het weggooien van yoursql-items.

Psuedo-gegevenslaag:

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

Maak de tvp:

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

)

Maak het opgeslagen 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

Als u een tweede set nummerparameters moet toevoegen, kunt u meerdere parameters van verschillende typen doorgeven aan de database. In het verleden hebben we verschillende generieke typen gemaakt om verschillende lijsten met gegevenstypen te ondersteunen in plaats van veel tabeltypen te moeten beheren.

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

Belangrijke dingen om te onthouden:

  • Het parametertype voor een tvp moet SqlDbType.Structured zijn
  • De TypeName voor de parameter moet overeenkomen met de naam van het parametertype Tabelwaarde.
  • De parameter Table Value Parameter in de opgeslagen procedure moet worden gedeclareerd als READONLY



  1. Hoe de mysql-schermconsole in Windows te wissen?

  2. Converteer een MySQL-database van latijn naar UTF-8

  3. Is er iets vergelijkbaars met Wamp Server?

  4. Update SQL Server-statistieken met behulp van een database-onderhoudsplan