2009-12-31 78 views
0

我有一个SELECT查询,产生多个结果,并没有任何ORDER BY子句。 如果我多次执行这个查询,然后使用DataReader.NextResult()遍历结果,我会保证以相同的顺序得到结果吗?是否DataReader.NextResult检索结果始终是相同的顺序

例如,如果我执行以下查询返回199行:

SELECT * FROM products WHERE productid < 200 

我会总是得到与productid = 1等第一个结果?

据我观察到它总是以相同的顺序返回结果,但我找不到这种行为的任何文档。

======================================

按我的研究: 看看这个博客Conor vs. SQL。我实际上想询问即使表中的数据保持不变(即没有更新或删除),查询结果是否也会发生变化。但似乎在大型表的情况下,当SQL服务器的员工并行时,订单可能不同

回答

7

首先,要迭代DataReader中的行,应该调用Read而不是NextResult
如果您的查询有多个SELECT语句,调用NextResult将移至下一个结果集。

要回答你的问题,你不能依赖这个。
没有ORDER BY子句的查询将返回SQL Server默认迭代顺序中的行。
对于小型表格,这将是通常是是添加行的顺序,但这不能保证,并且随时都可能发生变化。例如,如果表被索引或分区,则顺序将不同。

3

不,DataReader将按照它们从SQL返回的顺序返回结果。如果您不指定ORDER BY子句,那将是它们在表中存在的顺序。

+0

我同意罗里。如果你想按照特定的顺序,那么你应该在你的SQL语句中添加一个Order By。 – Walter 2009-12-31 13:51:05

1

这是可能的,或许甚至可能他们总是以相同的顺序返回,但这并不能保证。该顺序由数据库服务器上的queryplan(至少在SQL Server中)确定。如果某件事改变了查询计划,那么订单可能会改变。如果结果的顺序对于处理数据非常重要,则应始终使用ORDER BY。

相关问题