分頁實現的方法又多了一種,在SQL Server 2012版本中,TSQL在Order By子句中新增 Offset-Fetch子句,用於從有序的結果集中,跳過必定數量的數據行,獲取指定數量的數據行,從而達到數據行分頁的目的。通過測試,從邏輯讀取數量和響應的時間消耗來測評,使用Offset-Fetch實現的分頁方式,比Row_Number()方式性能要高不少。express
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 ] }
關鍵字解析:測試
分頁實現的思路:fetch
建立示例數據code
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)blog
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,修改爲分頁的通用格式ip
--分頁的索引,頁碼從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)io
order by子句的語法是:ORDER BY order_by_expression ,用於按照指定字段進行排序,一般有3種寫法:
上述三種寫法都會對查詢結果集進行排序,返回的結果集是有序的,可是,若是這樣寫,在order by子句中使用一個常量:
order by (select 1)
該子句中的 1 不是列的序號,而是常量,SQL Server按照結果集的原始順序返回,order by子句不對結果集排序。