我有一个SELECT查询,它产生多个结果,并且没有任何ORDER BY子句。 如果我多次执行此查询然后使用DataReader.NextResult()迭代结果,我是否可以保证以相同的顺序获得结果?
例如如果我执行以下返回199行的查询:
SELECT * FROM products WHERE productid < 200
我总能得到第一个带有productid = 1的结果吗?等等?
据我所知,它始终以相同的顺序返回结果,但我找不到任何有关此行为的文档。
======================================
根据我的研究: 查看此博客Conor vs. SQL。我实际上想问一下,即使表中的数据保持不变(即没有更新或删除),查询结果是否也会改变。但似乎在大表的情况下,当SQL服务器员工并行时,顺序可以不同
答案 0 :(得分:7)
首先,要迭代DataReader
中的行,您应该致电Read
,而不是NextResult
。
如果您的查询包含多个SELECT
语句,则调用NextResult
将移至下一个结果集。
要回答你的问题,你不能依赖于此
没有ORDER BY
子句的查询将返回SQL Server默认迭代顺序中的行
对于小型表,通常是添加行的顺序,但这不保证,并且可能随时更改。例如,如果表被索引或分区,则顺序将不同。
答案 1 :(得分:3)
不,DataReader将按照它们从SQL返回的顺序返回结果。如果未指定ORDER BY子句,那么它将是表中存在的顺序。
答案 2 :(得分:1)
有可能,甚至可能他们总是以相同的顺序返回,但这不能保证。该顺序由数据库服务器上的queryplan(至少在SQL Server中)确定。如果某些内容改变了查询计划,则订单可能会发生变化。如果结果的顺序对数据的处理很重要,则应始终使用ORDER BY。