2015-07-10 24 views
3

我有一个项目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 

调用此PROC找到结果7000并发次是荒谬的。是否有一种方法可以对每个项目进行线程处理,以便我一次多次调用该过程。现在需要大约20分钟时间才能完成项目

+0

您正在调用一个存储过程7000次?有没有更好的方法可以做到这一点?我不一定会这样建议,但是你可以让存储过程把一个'datatable'作为一个参数,这将大大减少你运行这个处理的时间。您必须在数据库中定义一个用户定义的表格,但要使用它 –

+0

请看一下SqlBulkCopy类。然后使用该类将ETL传递到临时表,并从选择临时表执行插入操作 –

回答

0

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

另一种方法是将参数与完整的项目集合作为varchar进行处理,然后建立一个查询,然后使用exec命令执行。

相关问题