sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er den optimale måde at få poster fra databasen i tilfælde af, at du skal passere lister, som hver af dem har mere end 2000 parametre?

Tabel værdisatte parametre er vejen at gå, hvis det virkelig er den måde, du skal gribe dette emne an.

  • Først skal du skifte til en lagret procedure, da du bruger SQL 2008 eller nyere.
  • For det andet, læs op på using erklæring om bortskaffelse af yoursql-emner.

Psuedo-datalag:

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

Opret tvp:

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

)

Opret den lagrede proc:

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

Hvis du har brug for at tilføje et andet sæt talparametre, kan du sende flere parametre af forskellige typer til databasen. Tidligere har vi oprettet flere generiske typer for at understøtte forskellige lister over datatyper i stedet for at skulle administrere en masse tabeltyper.

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

Vigtige ting at huske:

  • Parametertypen for en tvp skal være SqlDbType.Structured
  • TypeName for parameteren skal matche tabelværdiens parametertypenavn.
  • Tabelværdiparameteren i den lagrede procedure skal erklæres som READONLY



  1. MySQL:betingelse på resultatet af GROUP_CONCAT?

  2. PostgreSQL plpgsql få nuværende procedurer oid

  3. Cloud Vendor Deep-Dive:PostgreSQL på Microsoft Azure

  4. Henvisning til en anden kolonne i DEFAULT definition i SQL Server 2005