从C#调用SQL select语句数千次,非常耗时.有没有更好的办法?

use*_*680 6 c# sql sql-server

我从excel文件中获取了ID和金额列表(数千个id和相应的金额).然后我需要检查数据库以查看每个ID是否存在以及是否检查以确保DB中的金额大于或等于excel文件中的金额.

问题是运行此select语句超过6000次并返回我需要的值需要很长时间.即使在1/2秒的时间内,所有选择也需要大约一个小时.(我通常最多不会得到超过5个结果)

有更快的方法吗?

是否有可能以某种方式同时传递所有ID,只需拨打1个电话并获得大量收藏?

我尝试过使用SqlDataReaders和SqlDataAdapters,但它们看起来差不多(两种方式都太长)

以下是如何工作的一般概念

for (int i = 0; i < ID.Count; i++)
{
    SqlCommand cmd = new SqlCommand("select Amount, Client, Pallet from table where ID = @ID and Amount > 0;", sqlCon);

    cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID[i];

    SqlDataAdapter da = new SqlDataAdapter(cmd);

    da.Fill(dataTable);
    da.Dispose();           
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 13

in您可以通过表值参数立即传递所有值,而不是长列表(难以参数化并且有许多关于执行计划的低效率:编译时间,计划重用和计划本身).

有关更多详细信息,请参阅SQL Server中的数组和列表.

通常,我确保为表类型提供主键,并用于option (recompile)获取最合适的执行计划.

  • 当然这会导致"我如何在C#中做到这一点?" 这可以在这里得到解答:http://stackoverflow.com/a/10779567/84206 (3认同)

Nie*_*jes 5

将所有ID组合成一个大IN子句,其内容如下:

select Amount, Client, Pallet from table where ID in (1,3,5,7,9,11) and Amount > 0;
Run Code Online (Sandbox Code Playgroud)

  • @ user2755680您可以动态构建SQL,但是可以通过Parameter对象插入值,这比直接将值直接插入字符串更安全,例如:http://stackoverflow.com/questions/400819/using-an-in-operator用SQL命令对象和C锐化2-0 (2认同)
  • 对于问题中提到的6,000数字,无论如何您都不会很幸运。IIRC的参数限制约为2,000。文档中特别警告列表中很长的列表,可能会导致错误8623或8632。 (2认同)