頁面結果
ORDER BY 子句的一個延伸稱為 OFFSET-FETCH,可讓您只傳回查詢所選取的資料列範圍。 這可讓您進一步提供起點 (位移),還可提供值來指定要傳回多少資料列 (擷取值)。 此延伸提供方便的技術將結果分頁。
如果您想要每次傳回一「頁」的資料列 (使用您為一頁選擇的任何數目),則必須注意含有 OFFSET-FETCH 子句的每個查詢,獨立於其他任何查詢之外執行。 伺服器端不維護狀態,您必須透過用戶端程式碼,追蹤您在結果集之中的位置。
OFFSET-FETCH 語法
OFFSET-FETCH 子句在技術上屬於 ORDER BY 子句的一部分,語法如下所示:
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]
使用 OFFSET-FETCH
若要使用 OFFSET-FETCH,請提供 OFFSET 起始值 (可能是零),以及要傳回的選用資料列數目,如下列範例所示:
此範例會傳回前 10 個資料列,然後根據 ListPrice 傳回後 10 個資料列的產品資料:
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
若要取出「下一頁」的產品資料,請使用 OFFSET 子句來指定要跳過的資料列數目:
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
在語法定義中,您可以看到 OFFSET 子句是必要,但 FETCH 子句並非必要。 如果省略 FETCH 子句,則會傳回 OFFSET 之後的所有資料列。 您也會發現關鍵字 ROW 和 ROWS 可互換,如同 FIRST 和 NEXT,使語法更自然。
為了確保結果的正確性 (特別是逐頁翻閱資料時),請務必建立 ORDER BY 子句,以提供唯一排序並產生確定性結果。 由於 SQL Server 查詢最佳化工具的運作方式,在技術上,除非資料列的範圍是確定性,否則一個資料列有可能出現在一頁以上。