数据库分页存储过程(2)

/*
******************************************************************************************
  过程名称:Common_OrderUpend_Pagination
  过程功能:排序反转分页法实现的分页存储过程
  代码设计:小朱(zsy619@163.com)
  设计时间:2005-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
    
Begin Tran
    
-----------------------------------------------------------------代码设计--------------------------------------------------------------------
    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
    
     
--反转排序规则开始--
    ifcharindex(',',@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)
     
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
GO
posted @ 2006-01-05 09:07  迪克猪  阅读(478)  评论(0编辑  收藏  举报