河南网站建设首选公司,怎么做网站源代码,wordpress实时交流插件,华容网站sql server 分页查询[toc]前言SQL server 2012版本。下面都用pageIndex表示页数#xff0c;pageSize表示一页包含的记录。并且下面涉及到具体例子的#xff0c;设定查询第2页#xff0c;每页含10条记录。首先说一下SQL server的分页与MySQL的分页的不同#xff0c;mysql的分…sql server 分页查询[toc]前言SQL server 2012版本。下面都用pageIndex表示页数pageSize表示一页包含的记录。并且下面涉及到具体例子的设定查询第2页每页含10条记录。首先说一下SQL server的分页与MySQL的分页的不同mysql的分页直接是用limit (pageIndex-1)pageSize就可以完成但是SQL server 并没有limit关键字只有类似limit的top关键字。所以分页起来比较麻烦。SQL server分页我所知道的就只有四种三重循环、利用max主键、利用row_number关键字、offset/fetch next关键字方法一三重循环1、思路先取前20页然后倒序取倒序后前10条记录这样就能得到分页所需要的数据不过顺序反了之后可以将再倒序回来也可以不再排序了直接交给前端排序。还有一种方法也算是属于这种类型的这里就不放代码出来了只讲一下思路就是先查询出前10条记录然后用not in排除了这10条再查询。2、代码实现-- 设置执行时间开始用来查看性能的
set statistics time on ;
-- 分页查询通用型
select *
from (select top pageSize *from (select top (pageIndex * pageSize) *from studentorder by sNo asc) -- 其中里面这层必须指定按照升序排序省略的话查询出的结果是错误的。as temp_sum_studentorder by sNo desc) temp_order
order by sNo asc-- 分页查询第2页每页有10条记录
select *
from (select top 10 *from (select top 20 *from studentorder by sNo asc) -- 其中里面这层必须指定按照升序排序省略的话查询出的结果是错误的。as temp_sum_studentorder by sNo desc) temp_order
order by sNo asc;方法二利用max主键先top前11条行记录然后利用maxid得到最大的id之后再重新再这个表查询前10条不过要加上条件where idmax(id)。1、代码实现set statistics time on;-- 分页查询通用型
select top pageSize *
from student
where sNo (select max(sNo)from (select top ((pageIndex - 1) * pageSize 1) sNofrom studentorder by sNo asc) temp_max_ids)
order by sNo;-- 分页查询第2页每页有10条记录
select top 10 *
from student
where sNo (select max(sNo)from (select top 11 sNofrom studentorder by sNo asc) temp_max_ids)
order by sNo;方法三利用row_number关键字直接利用row_number() over(order by id)函数计算出行数选定相应行数返回即可不过该关键字只有在SQL server 2005版本以上才有。1、SQL实现set statistics time on;-- 分页查询通用型
select top pageSize *
from (select row_number()over (order by sno asc) as rownumber,*from student) temp_row
where rownumber ((pageIndex - 1) * pageSize);set statistics time on;
-- 分页查询第2页每页有10条记录
select top 10 *
from (select row_number()over (order by sno asc) as rownumber,*from student) temp_row
where rownumber 10;方法四offset /fetch next2012版本及以上才有1、代码实现set statistics time on;-- 分页查询通用型
select *
from student
order by sno
offset ((pageIndex - 1) * pageSize) rows fetch next pageSize rows only;-- 分页查询第2页每页有10条记录
select *
from student
order by sno
offset 10 rows fetch next 10 rows only;offset A rows ,将前A条记录舍去fetch next B rows only 向后在读取B条数据。五、封装的存储过程分页的时候直接调用这个存储过程就可以了。分页的存储过程create procedure paging_procedure
( pageIndex int, -- 第几页pageSize int -- 每页包含的记录数
)
as
begin select top (select pageSize) * -- 这里注意一下不能直接把变量放在这里要用selectfrom (select row_number() over(order by sno) as rownumber,* from student) temp_row where rownumber(pageIndex-1)*pageSize;
end-- 到时候直接调用就可以了执行如下的语句进行调用分页的存储过程
exec paging_procedure pageIndex2,pageSize10;六、总结以上四种分页方法中第二第三第三四种方法性能是差不多的但是第一种性能很差不推荐使用。推荐第四种毕竟第四种是SQL server公司升级后推出的新方法所以应该理论上性能和可读性都会更加好。