Sql-Server
SQL Server 中的分頁:是否需要 order by 子句?(目前,缺少行)
我們有一些通過 SQL 結果分頁的程式碼。(目前在 SQL Server 2008 上執行)
我們注意到,當分頁完成時,一些行沒有返回。讓我澄清一下:
nHibernate 生成 SQL 查詢。我們正在做分頁。如果我們按 100 分頁,nHibernate 生成連續 SQL 查詢的方式是:
- TOP 100 // 給我們前 100 個
- TOP 200 // 給了我們這個區塊的第二個 100
- 等等
以上,如果沒有在 nHibernate 級別進行 ORDER BY / 排序,最終結果是某些行永遠不會出現在 nHibernate 中。我們推測這是由於 SQL 的任意排序,因此行在頁面內“移動”(因此“隱藏”在我們的應用程式碼中)。
如果我們一次性執行 nHibnerate 查詢(返回所有行),我們會看到所有數據。(下面的這個查詢是由 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
使用
TOP(n)
withoutORDER BY
將以 Sql Server 關心的任何方式返回n行。根據文件:如果查詢沒有 ORDER BY 子句,則行的順序是任意的。
此外,沒有
WITH TIES
. 也考慮使用它,以免您也錯過一些行:WITH TIES 指定從基本結果集中返回的附加行在作為 TOP n (PERCENT) 行的最後一行出現的 ORDER BY 列中具有相同的值。TOP…WITH TIES 只能在 SELECT 語句中指定,並且只有在指定了 ORDER BY 子句時才能指定。
綁定記錄的返回順序是任意的。ORDER BY 不影響此規則。
考慮更新到 Sql Server 2012/2014。您可以享受新功能,例如使用
OFFSET FETCH
.