我使用的是 .Net 4.0 和 SQL Server 2008 R2。
我正在运行一个大型 SQL 选择查询,该查询返回数百万个结果并且需要很长时间才能完全运行。
有谁知道我怎样才能只读取查询返回的部分结果而不必等待整个查询完成?
换句话说,我想在查询仍在运行时读取第一个 10,000 条记录 block 并获得下一个结果。
最佳答案
这部分取决于查询本身是否在流式传输,或者它是否在临时表中做了很多工作然后(最终)开始返回数据。除了重写查询之外,在第二种情况下你不能做太多事情;然而,在第一种情况下,迭代器 block 通常会有所帮助,即
public IEnumerable<Foo> GetData() {
// not shown; building command etc
using(var reader = cmd.ExecuteReader()) {
while(reader.Read()) {
Foo foo = // not shown; materialize Foo from reader
yield return foo;
}
}
}
现在这是一个流式迭代器 - 你可以 foreach
通过它,它将从传入的 TDS 数据中实时检索记录,而无需先缓冲所有数据。
如果您(也许是明智的)不想编写自己的具体化代码,可以使用一些工具为您完成这项工作 - 例如,LINQ-to-SQL 的 ExecuteQuery<T>(tsql, args)
将无痛地进行上述操作。
关于c# - 处理大型 SQL 选择查询/分块读取 SQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726551/