Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какъв е оптималният начин за получаване на записи от база данни при сценарий, при който трябва да подадете списъци, всеки от които има повече от 2000 параметъра?

Параметрите с таблични стойности са правилният начин, ако това наистина е начинът, по който трябва да подходите към тази тема.

  • Първо, превключете към съхранена процедура, тъй като използвате SQL 2008 или по-нов.
  • Второ, прочетете за using изявление за изхвърляне на вашите SQL елементи.

Псевдо слой данни:

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

Създайте tvp:

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

)

Създайте съхранената процедура:

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

Ако трябва да добавите втори набор от числови параметри, тогава можете да подадете множество параметри от различни типове към базата данни. В миналото създадохме няколко общи типа, за да поддържаме различен списък от типове данни, вместо да се налага да управляваме много типове таблици.

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

Важни неща, които трябва да запомните:

  • Типът на параметъра за tvp трябва да бъде SqlDbType.Structured
  • TypeName за параметъра трябва да съвпада с името на типа параметър на стойността на таблицата.
  • Параметърът на параметъра на стойността на таблицата в съхранената процедура трябва да бъде деклариран като 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. Коментираният код извежда грешка

  2. Как да получите подниз с вградена функция на T-sql

  3. SQL SELECT ЧЧ:ММ - ЧЧ:ММ

  4. Скриване на таблица в база данни на SQL Server?

  5. Как да импортирам електронна таблица на Excel в SQL Server?