【问题标题】:Best Method to process a list that is used as a parameter to a stored procedure处理用作存储过程参数的列表的最佳方法
【发布时间】:2015-09-29 11:08:58
【问题描述】:

我有一个项目 ID 列表(12345、23456 等),但其中大约有 7000 个。 我正在做的是获取列表中的每个项目并将它们传递给存储过程以获取另一个数字,如果它符合过程中的标准。下面是 C# 代码:

        cmd.Parameters.Add("@itemId", SqlDbType.NVarChar);
        cmd.Parameters.Add("@division", SqlDbType.NVarChar);
        foreach (var item in itemNumber)
        {
            cmd.Parameters["@itemId"].Value = item;
            cmd.Parameters["@division"].Value = CboRequestDivisions.SelectedValue;

            reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                CboProductionOrder.Items.Add(reader[0].ToString());
            }
            reader.Close();
        } 

这是存储过程:

Select replace(PRODID,'Prod-','') from PRODTABLE where itemID = @itemId and (PRODSTATUS ='0' or PRODSTATUS = '2' or PRODSTATUS = '3' or PRODSTATUS = '4') and Dimension2_ = @division order by PRODID asc

调用这个过程来查找结果 7000 并发时间是荒谬的。有没有办法对每个项目进行线程化,所以我一次调用该过程多次。现在浏览这些项目大约需要 20 分钟

【问题讨论】:

  • 您正在调用存储过程 7000 次?没有更好的方法可以做到这一点吗?我不一定建议这样做,但是您可以使存储过程将datatable 作为参数,这将大大减少您运行此处理的时间。您必须在数据库中定义一个用户定义的表才能使用它
  • 看看 SqlBulkCopy 类。然后使用该类 ETL 到临时表并从临时表的选择中插入

标签: c# list stored-procedures


【解决方案1】:

我建议用分隔符构建一个包含所有项目的单个参数,然后在 SQL 中使用 PARSE 单独处理它们。

另一种方法是将带有完整项目集合的参数视为 varchar,并动态构建查询,然后使用 exec 命令执行它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多