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分钟时间才能完成项目
您正在调用一个存储过程7000次?有没有更好的方法可以做到这一点?我不一定会这样建议,但是你可以让存储过程把一个'datatable'作为一个参数,这将大大减少你运行这个处理的时间。您必须在数据库中定义一个用户定义的表格,但要使用它 –
请看一下SqlBulkCopy类。然后使用该类将ETL传递到临时表,并从选择临时表执行插入操作 –