Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql OrderBy子句在order列具有相同数据时生成不同的结果集_Sql_Sql Server 2008_Stored Procedures_Sql Order By - Fatal编程技术网

Sql OrderBy子句在order列具有相同数据时生成不同的结果集

Sql OrderBy子句在order列具有相同数据时生成不同的结果集,sql,sql-server-2008,stored-procedures,sql-order-by,Sql,Sql Server 2008,Stored Procedures,Sql Order By,我们有一个存储过程来根据页码和页面大小返回一组记录。排序由列CreateDateTime完成。如果所有记录的CreatedDateTime值相同,则以不同的顺序给出结果集。这种行为前后不一致 部分代码: SET @FirstRec = ( @PageNo - 1 ) * @PageSize SET @LastRec = ( @PageNo *@PageSize + 1 ) SELECT * FROM ( select ROW_NUMBER() OVER (ORD

我们有一个存储过程来根据页码和页面大小返回一组记录。排序由列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
请提供一些相关信息。

这是设计的

如果未指定ORDERBY子句,SQL Server或任何RDBMS都不保证以特定顺序返回结果。有些人认为,如果没有指定ORDERBY子句,行总是以聚集索引顺序或物理磁盘顺序返回。但是,这是不正确的,因为在查询处理过程中有许多因素会改变行顺序。对于更改行顺序的运算符来说,并行哈希联接是一个很好的示例

如果指定ORDERBY子句,SQL Server将对行进行排序并按请求的顺序返回它们。但是,如果由于存在重复的值而导致该顺序不确定,则在每个值组中,由于上述相同的原因,该顺序是随机的


保证确定性顺序的唯一方法是在ORDERBY子句中包含保证的唯一列或列组,例如主键

如果您排序依据的列中的值都相同,则无法保证它们将以相同的顺序检索。您可以按第二列排序-如果有唯一的id,可能是唯一的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

如果需要可复制的顺序,则需要确保在order BY中指定足够的列,以便order BY中列出的所有列的组合对于每一行都是唯一的。例如,如果EmpID是主键,则添加EmpID,以充当具有相等CreatedDateTime值的行之间的联系断路器。

您能否提供一些示例数据以了解什么是不一致性?这将首先按CreatedDateTime排序,然后按唯一id排序。因此,具有不同时间的条目的顺序肯定是正确的。您甚至不必使用RowNumber函数。上面的一个简单版本是像往常一样实现排序,并添加一个唯一的ID作为最后一个排序。例如,我有一些类似于通过CreatedDateTime从tmp顺序中选择*的内容,UniqueId偏移量10行仅获取下一个10行