4

我们有一个存储过程来返回基于页码和页面大小的记录集。排序是按列“ CreateDateTime”完成的。如果CreatedDateTime所有记录的值相同,则以不同的顺序给出结果集。行为不一致。

部分代码:

SET @FirstRec  = ( @PageNo - 1 ) * @PageSize 
SET @LastRec   = ( @PageNo *@PageSize + 1 )   

SELECT * 
FROM 
( 
      select ROW_NUMBER() OVER (ORDER BY CreatedDateTime)     
       AS rowNumber,EMPID 
      From Employee
) as KeyList 
WHERE rowNumber > @FirstRec AND rowNumber <  @LastRec

请就此提供一些意见。

4

3 回答 3

7

这是“设计”

ORDER BY如果未指定子句,SQL Server(或任何 RDBMS)不保证以特定顺序返回结果。有些人认为,如果没有指定 order by 子句,则总是以聚集索引顺序或物理磁盘顺序返回行。但是,这是不正确的,因为在查询处理期间有许多因素可以改变行顺序。并行 HASH 连接是更改行顺序的运算符的一个很好的示例。

如果指定ORDER BY子句,SQL Server 将对行进行排序并按请求的顺序返回它们。但是,如果该顺序不是确定性的,因为您有重复的值,那么在每个“值组”中,由于上述相同的原因,顺序是“随机的”。

ORDER BY保证确定顺序的唯一方法是在子句中包含保证唯一的列或列组(例如主键) 。

于 2013-07-29T12:15:06.560 回答
1

如果您需要可重现的顺序,那么您需要确保在 中指定足够的列ORDER BY,这样(在 中列出的所有列的组合ORDER BY)对于每一行都是唯一的。例如,添加(如果那是主键)充当具有相等值EmpID的行之间的“决胜局” 。CreatedDateTime

于 2013-07-29T12:16:05.480 回答
0

如果您 ORDER BY 列中的值都相同,则不能保证它们将以相同的顺序检索。您可以 ORDER BY 第二列 - 如果有的话,也许是唯一的 id?(我在下面的代码中将其称为 UniqueId)。这将确保顺序始终相同。

SELECT * 
FROM 
( 
      select ROW_NUMBER() OVER (ORDER BY CreatedDateTime, UniqueId)     
       AS rowNumber,EMPID 
      From Employee
) as KeyList 
WHERE rowNumber > @FirstRec AND rowNumber <  @LastRec
于 2013-07-29T12:15:19.213 回答