sqlserver 分页_四类数据库分页实现方案总结之sqlserver分页实现

概述

前段时间已经介绍了Oracle和MYSQL的分页实现方案,今天主要介绍一下sqlserver如何实现分页。

SQL server的分页与MySQL的分页的不同,mysql的分页直接是用limit (pageIndex-1),pageSize就可以完成,但是SQL server 并没有limit关键字,只有类似limit的top关键字。所以分页起来比较麻烦。


1、三重循环

先取前20页,然后倒序,取倒序后前10条记录,这样就能得到分页所需要的数据,不过顺序反了,之后可以将再倒序回来,也可以不再排序了,直接交给前端排序。还有一种方法是先查询出前10条记录,然后用not in排除了这10条,再查询。

一般实现过程如下:

-- 设置执行时间开始,用来查看性能的set statistics time on ;-- 分页查询select *  from (select top pageSize *          from (select top(pageIndex * pageSize) *                  from t                 order by tablenumber asc) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。               as temp         order by tablenumber desc) temp_2 order by tablenumber asc

2、利用max(主键)

先top前11条行记录,然后利用max(id)得到最大的id,之后再重新再这个表查询前10条,不过要加上条件,where id>max(id)。

一般实现过程如下:

set statistics time on;-- 分页查询select top pageSize *  from table where tablenumber >=       (select max(tablenumber)          from (select top((pageIndex - 1) * pageSize + 1) tablenumber                  from table                 order by tablenumber asc) temp_max_ids) order by tablenumber;

3、利用row_number关键字

直接利用row_number() over(order by id)函数计算出行数,选定相应行数返回即可,不过该关键字只有在SQL server 2005版本以上才有。

set statistics time on;-- 分页查询select top pageSize *  from (select row_number() over(order by tablenumber asc) as rownumber,*          from table) temp_row where rownumber > ((pageIndex - 1) * pageSize);

4、offset /fetch next(2012版本及以上才有)

offset A rows ,将前A条记录舍去,fetch next B rows only ,向后在读取B条数据。

set statistics time on;-- 分页查询select *  from table order by tablenumber  offset((@pageIndex - 1) * @pageSize) rows  fetch next @pageSize rows only;

5、存储过程实现

写分页的时候,直接调用这个分页存储过程

create procedure paging_procedure(@pageIndex int, -- 第几页@pageSize int  -- 每页包含的记录数)asbegin select top (select @pageSize) *     -- 这里注意一下,不能直接把变量放在这里,要用selectfrom (select row_number() over(order by tablenumber) as rownumber,* from table) temp_row where rownumber>(@pageIndex-1)*@pageSize;end-- 到时候直接调用就可以了,执行如下的语句进行调用分页的存储过程exec paging_procedure @pageIndex=2,@pageSize=10;

6、实例演示

6.1、环境准备

CREATE TABLE [dbo].[t] (  [EMPNO] decimal(12)   NULL,  [ENAME] nvarchar(10) COLLATE Chinese_PRC_CI_AS  NOT NULL,  [JOB]   nvarchar(10) COLLATE Chinese_PRC_CI_AS  NOT NULL,  [MGR]   decimal(12)  NULL,  [HIREDATE] datetime,  [SAL] decimal(12)  NULL,  [COMM] decimal(12)   NULL,  [DEPTNO] decimal(12)  NULL)GOALTER TABLE [dbo].[t] SET (LOCK_ESCALATION = TABLE)GOINSERT INTO [dbo].[t] VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17 00:00:00', '800', NULL, '20');INSERT INTO [dbo].[t] VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20 00:00:00', '1600', '300', '30');INSERT INTO [dbo].[t] VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22 00:00:00', '1250', '500', '30');INSERT INTO [dbo].[t] VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02 00:00:00', '2975', NULL, '20');INSERT INTO [dbo].[t] VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28 00:00:00', '1250', '1400', '30');INSERT INTO [dbo].[t] VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01 00:00:00', '2850', NULL, '30');INSERT INTO [dbo].[t] VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09 00:00:00', '2450', NULL, '10');INSERT INTO [dbo].[t] VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19 00:00:00', '3000', NULL, '20');INSERT INTO [dbo].[t] VALUES ('7839', 'KING', 'PRESIDENT', NULL, '1981-11-17 00:00:00', '5000', NULL, '10');INSERT INTO [dbo].[t] VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08 00:00:00', '1500', '0', '30');INSERT INTO [dbo].[t] VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23 00:00:00', '1100', NULL, '20');INSERT INTO [dbo].[t] VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03 00:00:00', '950', NULL, '30');INSERT INTO [dbo].[t] VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03 00:00:00', '3000', NULL, '20');INSERT INTO [dbo].[t] VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23 00:00:00', '1300', NULL, '10');GO
7fed9fb5d58513573d37007fbfacc62c.png

6.2、利用max实现

set statistics time on;-- 分页查询select top 5 *  from t where empno >=       (select max(empno)          from (select top((1 - 1) * 5 + 2) empno                  from t                 order by empno asc) temp_max_ids) order by empno desc;
1172e4fbf175e0b22e08392602a0229f.png

6.3、利用row_number实现(推荐)

set statistics time on;-- 分页查询select top 6 *  from (select row_number() over(order by empno desc) as rownumber,*          from t) temp_row where rownumber > ((1 - 1) * 6);
2ef4a974d48c7007850bd56571b75200.png

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

578f987627ac5c435e25f2f2f3e579c9.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值