存储过程分页

来源:互联网 发布:网络水晶头价格 编辑:程序博客网 时间:2024/04/29 23:13

/*
******************************************************************************************
  过程名称:Common_OrderUpend_Pagination
  过程功能:排序反转分页法实现的分页存储过程
  代码设计:郭帅

  设计时间:2009-11-3 13:58:26
******************************************************************************************
  功能描述:

******************************************************************************************
  如果您修改了我的程序,请留下修改记录,以便对程序进行维护,谢谢  !!!
==========================================================================================
  修改人   修改时间    修改原因
------------------------------------------------------------------------------------------

==========================================================================================

******************************************************************************************
  备注:
 在这个采用排序反转分页法实现的分页存储过程中,
 ①若当前为第一页,则直接取出记录;②若当前页码大于总页码,则返回空结构;
 ③若当前页码的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中的记录就是我们想要的结果。
*****************************************************************************************
*/
Create  Procedure [dbo].[Common_OrderUpend_Pagination]
 @PageCurr int=1,  --当前页码
  @PageSize int=10,  --每页条数
  @QueryString varchar(5000), --查询字符串
  @OrderString varchar(5000), --排序规则
  @FieldShow varchar(5000), --要显示的字段
  @RecordCount int output  --总记录条数
AS
 Declare @intResult Int
 -----------------------------------------------------------------代码设计--------------------------------------------------------------------
 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
 --print @RecordCount
  --统计记录数结束--
 
 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 @@rowcount
 end else if(@PageCurr>@PageCount)
 begin
  set @RecordQuery='select top 0 '+@FieldShow+' from('+@QueryString+') '+@ViewName
    --print('总记录显示不了这么多页')
    --print('实际执行的查询为:'+@RecordQuery)
    exec(@RecordQuery)
  return @@rowcount
 end
 else 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)
  return @@rowcount
 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 @@rowcount
 end
 --print @RecordQuery
 Set @intResult = @@ROWCOUNT
 ----------------------------------------------------------------------------------------------------------------------------------------------------
 If @@Error <> 0
 Begin
  RollBack Tran
  Return -1
 End
 Else
 Begin
  Commit Tran
  Return @intResult
 End