SqlServer分页

今天看到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值