我从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)获取最合适的执行计划.
将所有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)
| 归档时间: |
|
| 查看次数: |
1441 次 |
| 最近记录: |