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)[email protected])  
               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)[email protected]) --取出前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)[email protected]) 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,@[email protected] output 
   --定义与游标和游标选项相关联的 SQL 语句,然后填充游标。 
   --选择总页数,总行数,当前页 
    select ceiling([email protected][email protected]) as TotalPages,@rowcount as TotalRows,@currentpage as CurPage 
    set @currentpage=(@currentpage-1)[email protected]+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  (@[email protected])  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<[email protected]*@page-- 
end 

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

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6708.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论