分页实现的方法又多了一种,在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子句不对结果集排序。