5

在 SQL 2005/2008 数据库中,我们有表 BatchMaster。列:RecordId bigint - 自动增量 ID,BatchNumber bigint - 唯一非聚集索引,BatchDate)。我们有从这个表返回分页数据的 sproc。该存储过程适用于大多数客户端,但在一个 SQL 服务器实例中,我们的记录顺序存在问题。一般来说,在 sproc 我们做

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow

因此,您可以从上面的脚本中注意到,我们希望返回按 BatchDate 和 BatchNumber 排序的记录。这不会发生在我们的一位客户身上: 在此处输入图像描述

记录顺序错误。另外,请注意第一列(行),它不是按升序排列的。

有人可以解释为什么会这样吗?

4

4 回答 4

8

假设您想要最小的BatchNumber给定数字,并且您希望按 排序,试试这个:BatchDateRowRow

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber asc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow
order by Row
于 2012-06-11T13:22:22.220 回答
7

您的代码实际上并未对结果进行排序,它仅根据 BatchDate 和 Batchnumber 的顺序设置“行”,并且似乎正确地执行了该操作。您需要在语句中添加 ORDER BY Row。

于 2012-06-11T13:22:10.510 回答
2

更改查询以在最外层查询中包含排序

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow
order by Row
于 2012-06-11T13:22:44.077 回答
2

您的排名函数中的ORDER BY子句ROW_NUMBER仅适用于计算该排名函数的值,它实际上并不对结果进行排序。

如果您希望按特定顺序返回记录,则需要在查询中指定:ORDER BY [Row]

于 2012-06-11T13:26:38.577 回答