1、top
这种方法主要是在sql server 2000中使用,效率较差,这里就不详细说了。
2、row_number函数
这种方法是sql server 2005以后,支持了row_number函数后,才开始使用的。
一开始是这么写的,但是效率不好:
declare @page_size int; declare @page_num int; --比如:每页10条记录 set @page_size = 10; --比如:先取第2页 set @page_num = 2; select * from ( select *, (row_number() over(order by 图书编号) - 1) / @page_size as rownum from test )t where rownum = @page_num - 1
修改一下,直接用范围来限制:
declare @page_size int; declare @page_num int; --比如:每页10条记录 set @page_size = 10; --比如:先取第2页 set @page_num = 2; select * from ( select *, row_number() over(order by 图书编号) as rownum from test )t where rownum between (@page_num-1)*@page_size+1 and @page_num*@page_size
3、SQL Server 2012开始支持的 offset fetch next 方法
declare @page_size int; declare @page_num int; --比如:每页10条记录 set @page_size = 10; --比如:先取第2页 set @page_num = 2; select * from test order by 图书编号 offset (@page_num-1)*@page_size rows fetch next @page_size rows only
附录:
建表代码,表test包含主键,且为自增列:
CREATE TABLE [dbo].[test]( [图书编号] [decimal](10, 0) IDENTITY(1,1) NOT NULL, [书名] [varchar](80) NOT NULL, [作者] [varchar](80) NOT NULL, [出版社] [int] NOT NULL, [出版日期] [datetime] NOT NULL, [图书类型] [int] NOT NULL, [ISBN号] [varchar](40) NOT NULL, [定价] [float] NOT NULL, [图书数量] [tinyint] NOT NULL ) ON [PRIMARY] insert into test ( [书名] ,[作者] ,[出版社] ,[出版日期] ,[图书类型] ,[ISBN号] ,[定价] ,[图书数量] ) select [书名] ,[作者] ,[出版社] ,[出版日期] ,[图书类型] ,[ISBN号] ,[定价] ,[图书数量] from test go 15 alter table [test] add constraint pk_test primary key([图书编号])
数据条数为432万条:
--4325376 select count(*) from test