SQL2005分页查询

1 通过select top进行分页查询 

/*查询原理:需要查询第N页时,首先取到前N页的所有数据,然后排除前N-1页的数据,就是第N页的数据*/
create  PROCEDURE GetDataWithPage
( 
       @pageIndex  int = 1,           -- 页码
      @pageSize   int = 20,          -- 页尺寸  
)
as
    begin
     if @pageIndex < 1
begin
Set @pageIndex=1
end                 


--如果是第一页时要执行的语句
  if @PageIndex = 1
      begin
              select top ((@PageIndex)*@PageSize) 
               field1,field2,--查询字段
               fieldOrderby --排序字段,按什么字段分页的字段,建议使用主键,或者唯一键
               from tableName --查询表名称
              where id>100 --查询条件
              order by fieldOrderby --排序字段,按什么字段分页的字段,
             select count(*) as Total from tableName where id>100--返回总记录数
    end
  else  
         begin
                 select top ((@PageIndex)*@PageSize) --取出前PageIndex页的数据
                            field1,field2,--查询字段
                            fieldOrderby --排序字段,按什么字段分页的字段,建议使用主键,或者唯一键
                            into #tempTable --插入临时表
                            from tableName --查询表名称
                            where id>100 --查询条件
                           order by fieldOrderby --排序字段,按什么字段分页的字段,
                  -----取出前pageIndex页数据插入临时表

                 ------排除前pageIndex-1页的数据,取出第pageIndex的数据
                  select top (@PageIndex) --
                             field1,field2,--排序字段
                            fieldOrderby --
                           from #tempTable --从临时表中取数据
                          where fieldOrderby --
                          not in (select  top ((@PageIndex-1)*@PageSize) fieldOrderby from #tempTable)
                        ---- 从临时表取出 pageIndex的数据 
                            ----可以根据升序或者降序把not in 改为 <min(fieldOrderby)或者>max(fieldOrderby)
                 select count(*) as Total from tableName where id>100--返回总记录数
       end
end

2通过系统存储过程进行分页查询

 /*
 一共返回三个表第一个表为空 查询字符串的条件中有 like ,in 可能出现问题,具体出现原因不明,第二个表包含总页数,总行数,
当前页第三个表包含查询记录

*/
create   procedure [dbo].[GetOnePageData]
   @sqlstr nvarchar(4000), --查询字符串  ,就是一般的查询语句,不需要top关键字
   @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
   --定义与游标和游标选项相关联的 SQL 语句,然后填充游标。
   --选择总页数,总行数,当前页
    select ceiling(1.0*@rowcount/@pagesize) as TotalPages,@rowcount as TotalRows,@currentpage as CurPage
    set @currentpage=(@currentpage-1)*@pagesize+1
   --查询记录
    exec sp_cursorfetch @P1,16,@currentpage,@pagesize --从游标中提取一行或一个行块。
   --返回值
    exec sp_cursorclose @P1--关闭并释放游标
     set nocount off
go


3 通过新函数ROW_NUMBER()进行分页查询

/*
适用于sql2005,据调查此方法限制最少,性能最佳
返回两个表,第一个表包含总行数,第二个表是查询到的记录
--分页查询的原理:
--1.先将预分页内容按照排序条件加上自增列导入到临时表中(或表变量)
--2.针对临时表操作,找到相应的N页对应的自增列编码范围
--3.根据第N页对应的自增列编码范围,查找第N页内容
 
--需要注意的是:
--第一是添加自增列,确定行号
--第二缩减中间处理过程的操作数据量

*/

create  proc [dbo].[GetOnePageData]--//
(
    @page int,
    @pagesize int
)
as
begin    
        select top  (@pagesize*@page)  ROW_NUMBER() --可以减少处理的数据,加快速度
         OVER(ORDER BY NodeID) as rowNum,--按什么字段分页的字段,不需要唯一性
        NodeID,NodeName,ControlIP --查询字段
        into #temp --插入临时表
        from TableName   --  查询表名称 
        where NodeID>100 --查询条件
       
       select count(*) from #temp--总记录条数
       select * from #temp where rowNum>@pagesize*(@page-1) and rowNum<=@pagesize*@page--
end 

  综述,如果需要通用的存储过程,可以把第一或者第三种分页方法进行改写,在数据库拼字符串,但性能会差好多。这或许就是通用和性能之间的矛盾吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值