键盘敲击者cncxz

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理


/*  -- [排序反转分页法]分页存储过程 --
----------   Summary     ----------------
在这个采用排序反转分页法实现的分页存储过程中,
①若当前为第一页,则直接取出记录;②若当前页码大于总页码,则返回空结构;
③若当前页码的2倍小于或等于总页码,
    则先按排序规则截取前n[n=当前页码*每页条数]条记录形成视图1,
    接着截取视图1中的后m[m=每页条数]条形成视图2(实际操作是反转排序规则,取前m条),
    最后再次反转排序规则(负负得正,用默认排序规则就可以了)截取视图2中的前m[m=每页条数]条形成视图3,
    视图3中的记录就是我们想要的结果;
④若当前当前页码的2倍大于总页码,
    则按排序规则截取后n[n=总记录-(当前页码-1)*每页条数]条记录形成视图1(实际操作是反转排序规则,取前n条),
    然后按默认排序规则截取视图1中的前m[m=每页条数]条形成视图2
    视图2中的记录就是我们想要的结果。
  ———— 丛兴滋(cncxz) 2005.12.19

----特别感谢windwang和fyw的帮助

---------------------------------------------------
*/


CREATE    PROCEDURE [dbo].[OrderUpendPager]
 @PageCurr int=1,  --当前页码
 @PageSize int=10,  --每页条数
 @QueryString varchar(5000), --查询字符串
 @OrderString varchar(5000), --排序规则
 @FieldShow varchar(5000), --要显示的字段
 @RecordCount int output  --总记录条数

AS
 declare @ViewName varchar(100)  --临时查询视图名称
 set @ViewName='tempView'
 declare @RecordQuery varchar(5000) --记录查询
 declare @OrderUpend varchar(5000) --排序规则反转

 if(@FieldShow='' or @FieldShow=null)
  set @FieldShow='*'
 if(@PageCurr=0 or @PageCurr=null)
  set @PageCurr=1
 if(@PageSize=0 or @PageSize=null)
  set @PageSize=10
 
 if(@OrderString='' or @OrderString=null)
  begin
   print('Err:必须设置排序规则--')
   return
  end

 --反转排序规则开始--
 if( charindex(',',@OrderString)=0 )
  begin
   if(charindex(' desc',@OrderString)=0)
    set @OrderUpend=replace(@OrderString,' asc','')+' desc'     
   else
    set @OrderUpend=replace(@OrderString,' desc','')
  end
 else
  begin
   set @OrderUpend=''
   DECLARE @strSingle varchar(100)
   DECLARE @strTemp varchar(1000)
   DECLARE @strSpace varchar(10)
   set @strSpace=''
   set @strTemp=@OrderString

   while @strTemp<>''
   begin
    if(charindex(',',@strTemp)=0)
     begin
      set @strSingle=@strTemp
      set @strTemp=''
     end
    else
     begin
      set @strSingle=substring(@strTemp,1,charindex(',',@strTemp)-1)
      set @strTemp=substring(@strTemp,charindex(',',@strTemp)+1,8000)
     end
    
    if(charindex(' desc',@strSingle)=0)
     set @strSingle=replace(@strSingle,' asc','')+' desc'     
    else
     set @strSingle=replace(@strSingle,' desc','')
    print(@strSingle)
    set @OrderUpend=@OrderUpend+@strSpace+@strSingle
    set @strSpace=','
    
   end
  end
 --反转排序规则结束--
 print('排序规则:'+@OrderString)
 print('反 转 后:'+@OrderUpend)

 

 --统计记录数开始--
 create table #tempTBcount(myCount int) 
 exec('insert into #tempTBcount select count(0) from ( '+@QueryString+' ) '+@ViewName+'')
 select @RecordCount=mycount from #tempTBcount drop table #tempTBcount
 --统计记录数结束--


 declare @PageCount int --总页数 
 DECLARE @PassRecordCount int --预先取出的记录数 
 if(@RecordCount%@PageSize=0)
  set @PageCount=@RecordCount/@PageSize
 else
  set @PageCount=(@RecordCount-@RecordCount%@PageSize)/@PageSize+1


if (@PageCurr=1)
 begin
  set @RecordQuery='select top '+CONVERT(nvarchar, @PageSize)+' '+@FieldShow+' from ('+
   @QueryString+') '+@ViewName+'_1 order by '+@OrderString   
  print('只是显示第一页数据')
  print('实际执行的查询为:'+@RecordQuery)
  exec(@RecordQuery)
  return
 end

if(@PageCurr>@PageCount)
 begin
  set @RecordQuery='select top 0 '+@FieldShow+' from('+
   @QueryString+') '+@ViewName
  print('总记录显示不了这么多页')
  print('实际执行的查询为:'+@RecordQuery)
  exec(@RecordQuery)
  return
 end

if(@PageCurr * 2<=@PageCount)
 begin
  set @PassRecordCount=@PageCurr*@PageSize
  set @RecordQuery=' select top '+CONVERT(nvarchar, @PageSize)+' '+@FieldShow+' from (  '+
   'select top '+ CONVERT(nvarchar, @PageSize) +' * from ( '+
    'select top '+ CONVERT(nvarchar, @PassRecordCount) +' * from ( '+
     @QueryString+' ) '+@ViewName+'_1 order by '+@OrderString+
    ') '+@ViewName+'_2 order by '+@OrderUpend+
   ') '+@ViewName+'_3 order by '+@OrderString
  
  print('头部截取')
  print('实际执行的查询为:'+@RecordQuery)
  exec(@RecordQuery)
 end

else
 begin
  set @PassRecordCount=@RecordCount-(@PageCurr-1)*@PageSize
  set @RecordQuery=' select top '+CONVERT(nvarchar, @PageSize)+' '+@FieldShow+' from (  '+
   'select top '+ CONVERT(nvarchar, @PassRecordCount) +' * from ( '+
    @QueryString+' ) '+@ViewName+'_1 order by '+@OrderUpend+
   ') '+@ViewName+'_2 order by '+@OrderString
  print('尾部截取')
  print('实际执行的查询为:'+@RecordQuery)
  exec(@RecordQuery)
  return
 end

GO

posted on 2005-12-19 14:05  cncxz(虫虫)  阅读(2395)  评论(6编辑  收藏  举报