今天看到guguda2008博客中的关于sqlserver分页的分析,总结下分页吧
use master
go
set nocount on
go
set showplan_text on
go
--2012的OFFSET分页方式
select number
from spt_values
where type='p'
order by number offset 10 rows fetch next 5 rows only;
go
--2005的ROW_NUMBER分页方式
select number from (
select number,row_number() over(order by number) as num from spt_values where type='p'
) t where num between 11 and 15
order by number asc
go
--2000的TOP分页方式
select number from (
select top 5 number from (
select top 15 number from spt_values where type='p' order by number asc
) t
order by number desc
) t
order by number asc
go
set showplan_text off
go
转载自:http://blog.csdn.net/guguda2008/article/details/7370398
?
?
其他还有几种分页方式,如下:
1.分页方案一:(利用Not In和SELECT TOP分页)
语句形式:?? SELECT TOP 页记录数量 * FROM 表名 WHERE (ID NOT IN ?? (SELECT TOP (每页行数*(页数-1)) ID ??? FROM 表名 ??? ORDER BY ID)) ??? ORDER BY ID //自己还可以加上一些查询条件
例: select top 2 * from Sys_Material_Type where (MT_ID not in? ???? (select top (2*(3-1)) MT_ID from Sys_Material_Type? order by MT_ID)) order by MT_ID
?
2.分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式: SELECT TOP 每页记录数量 * FROM 表名 WHERE (ID > ?????????? (SELECT MAX(id) ???? FROM (SELECT TOP 每页行数*页数 id?? FROM 表 ??????????? ORDER BY id) AS T) ??????? ) ORDER BY ID
例: SELECT TOP 2 * FROM Sys_Material_Type WHERE (MT_ID > ?????????? (SELECT MAX(MT_ID) ??????????? FROM (SELECT TOP (2*(3-1)) MT_ID ????????????????? FROM Sys_Material_Type ????????????????? ORDER BY MT_ID) AS T)) ORDER BY MT_ID
?
3.分页方案三:(利用SQL的游标存储过程分页) create? procedure SqlPager @sqlstr nvarchar(4000),--查询字符串 @currentpage int,--第N页 @pagesize int --每页行数 as set nocount on declare @P1 int,--P1是游标的id ? @rowcount int exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页? set @currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize? exec sp_cursorclose @P1 set nocount off 参考自:http://topic.csdn.net/u/20100203/17/8f916471-597d-481a-b170-83bcefe3b199.html
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|