分頁實現的方法又多了一種,在SQL Server 2012版本中,TSQL在Order By子句中新增 Offset-Fetch子句,用於從有序的結果集中,跳過一定數量的數據行,獲取指定數量的數據行,從而達到數據行分頁的目的。經過測試,從邏輯讀取數量和響應的時間消耗來測評,使用Offset-Fetch實現的分頁方式,比Row_Number()方式性能要高很多。
Offset-Fetch子句要求結果集是有序的,因此,只能用於order by 子句中,語法如下:
ORDER BY order_by_expression [ ASC | DESC ] [ ,...n ] [ <offset_fetch> ]
<offset_fetch> ::= { OFFSET { integer_constant | offset_row_count_expression } ROWS [ FETCH NEXT {integer_constant | fetch_row_count_expression } ROWS ONLY ] }
關鍵字解析:
- Offset子句:用於指定跳過(Skip)的數據行;
- Fetch子句:該子句在Offset子句之后執行,表示在跳過(Sikp)指定數量的數據行之后,返回一定數據量的數據行;
- 執行順序:Offset子句必須在Order By 子句之后執行,Fetch子句必須在Offset子句之后執行;
分頁實現的思路:
- 在分頁實現中,使用Order By子句,按照指定的columns對結果集進行排序;
- 使用Offset子句跳過前N頁:Offset (@PageIndex-1)*@RowsPerPage rows;
- 使用Fetch子句呈現當前Page:Fetch next @RowsPerPage rows only;
一,使用order-offset-fetch分頁
創建示例數據

use tempdb go create table dbo.dt_test ( id int, code int ) go insert into dbo.dt_test(id,code) values(1,1),(2,2),(3,1),(4,2),(5,1),(6,2)
1,使用Offset子句跳過指定數目的數據行
select * from dbo.dt_test order by id offset 2 rows
2,使用Offset-Fetch子句跳過指定數目的數據行之后,返回指定數目的數據行
select * from dbo.dt_test order by id offset 2 rows fetch next 2 rows only
3,修改成分頁的通用格式
--分頁的索引,頁碼從1開始 declare @PageIndex int --每頁顯示的行數 declare @Size int set @PageIndex=1 set @Size=100 select * from dbo.dt_test order by id offset (@PageIndex - 1) * @Size rows fetch next @Size rows only
二,排序(order by)
order by子句的語法是:ORDER BY order_by_expression ,用於按照指定字段進行排序,通常有3種寫法:
- select子句中列的name,或alias,排序子句(order by)的執行順序在select子句之后,可以使用列的Alias進行排序;
- 表達式,按照表達式的計算結果進行排序;
- select子句中列的序號,從1開始,此處的數值是序號,不建議使用;
上述三種寫法都會對查詢結果集進行排序,返回的結果集是有序的,但是,如果這樣寫,在order by子句中使用一個常量:
order by (select 1)
該子句中的 1 不是列的序號,而是常量,SQL Server按照結果集的原始順序返回,order by子句不對結果集排序。
參考文章: