0

我有一个 SELECT 查询,它产生多个结果并且没有任何 ORDER BY 子句。如果我多次执行此查询,然后使用 DataReader.NextResult() 遍历结果,是否可以保证以相同的顺序获得结果?

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

SELECT * FROM products WHERE productid < 200

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

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

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

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

4

3 回答 3

7

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

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

于 2009-12-31T13:50:01.247 回答
3

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

于 2009-12-31T13:48:56.460 回答
1

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

于 2009-12-31T13:51:42.290 回答