在SQL 2005/2008数据库中,我们有表BatchMaster。列: RecordId bigint - autoincremental id,BatchNumber bigint - 唯一的非聚集索引,BatchDate)。我们有sproc返回此表中的分页数据。该sproc适用于大多数客户端,但在一个SQL服务器实例中,我们遇到记录顺序问题。 一般来说,我们做的是
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排序的记录。对于我们的一位客户来说,这不会发生:
记录顺序错误。另外,请注意第一列(行),它不是按升序排列的。
有人可以解释原因吗?
答案 0 :(得分:7)
您的代码实际上并未对结果进行排序,它只根据BatchDate和Batchnumber的顺序设置'Row',并且似乎正确地执行了此操作。您需要在语句中添加ORDER BY Row。
答案 1 :(得分:7)
假设您希望给定BatchNumber
的{{1}}最低BatchDate
且Row
号为Row
,并且想要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
订购,请尝试以下操作:
{{1}}
答案 2 :(得分: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
答案 3 :(得分:2)
ORDER BY
排名函数中的ROW_NUMBER
子句仅适用于计算该排名函数的值,但实际上并未对结果进行排序。
如果您希望按特定顺序返回记录,则需要在查询中指明:ORDER BY [Row]