SQL Server 中的分页:是否需要 order by 子句?(目前,行被遗漏)

Jon*_*ica 4 sql-server-2008 sql-server paging nhibernate

我们有一些代码可以分页查看 SQL 结果。(目前在 SQL Server 2008 上运行)

我们注意到当分页完成时,一些行没有返回。让我澄清一下:

nHibernate 生成 SQL 查询。我们正在做分页。如果我们按 100 页,nHibernate 生成连续 SQL 查询的方式是:

  • TOP 100 // 给我们前 100 个
  • TOP 200 // 给我们这个块的第二个 100
  • 等等

以上,在 nHibernate 级别没有 ORDER BY / 排序,最终结果是某些行永远不会出现在 nHibernate 中。我们推测这是由于 SQL 的任意排序造成的,因此行在页面内“移动”(从而从我们的应用程序代码中“隐藏”)。

如果我们单次执行 nHibrate 查询(返回所有行),我们会看到所有数据。(下面的这个查询是由 nhibernate 生成的。)

添加 order by 子句(又名 nHibernate 排序)有帮助吗?

SELECT top 33 
 ... <field list> 
FROM 
  salesOrder this_ left outer join [Item] Item2_ on this_.ItemId=Item2_.ItemId 
WHERE this_.AccountId = @p0 
and this_.ModifiedAt > @p1 
and this_.ModifiedAt <= @p2
Run Code Online (Sandbox Code Playgroud)

von*_*ryz 8

使用TOP(n)withoutORDER BY将以Sql Server 关心的任何方式返回n行。根据文档

如果查询没有 ORDER BY 子句,则行的顺序是任意的。

此外,没有WITH TIES。也考虑使用它,以免您也可能错过一些行:

WITH TIES 指定从基本结果集中返回的附加行在 ORDER BY 列中具有相同的值,显示为 TOP n (PERCENT) 行中的最后一行。TOP...WITH TIES 只能在 SELECT 语句中指定,并且仅当指定了 ORDER BY 子句时。

绑定记录的返回顺序是任意的。ORDER BY 不影响此规则。

考虑更新到 Sql Server 2012/2014。您可以享受新功能,例如使用 自动分页OFFSET FETCH