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

ExpandedBlockStart.gifContractedBlock.gif/**//*
InBlock.gif******************************************************************************************
InBlock.gif  过程名称:Common_OrderUpend_Pagination
InBlock.gif  过程功能:排序反转分页法实现的分页存储过程
InBlock.gif  代码设计:小朱(zsy619@163.com)
InBlock.gif  设计时间:2005-11-3 13:58:26
InBlock.gif******************************************************************************************
InBlock.gif  功能描述:
InBlock.gif
InBlock.gif******************************************************************************************
InBlock.gif  如果您修改了我的程序,请留下修改记录,以便对程序进行维护,谢谢  !!!
InBlock.gif==========================================================================================
InBlock.gif  修改人            修改时间                修改原因
InBlock.gif------------------------------------------------------------------------------------------
InBlock.gif
InBlock.gif==========================================================================================
InBlock.gif
InBlock.gif******************************************************************************************
InBlock.gif  备注:
InBlock.gif    在这个采用排序反转分页法实现的分页存储过程中,
InBlock.gif    ①若当前为第一页,则直接取出记录;②若当前页码大于总页码,则返回空结构;
InBlock.gif    ③若当前页码的2倍小于或等于总页码,
InBlock.gif        则先按排序规则截取前n[n=当前页码*每页条数]条记录形成视图1,
InBlock.gif        接着截取视图1中的后m[m=每页条数]条形成视图2(实际操作是反转排序规则,取前m条),
InBlock.gif        最后再次反转排序规则(负负得正,用默认排序规则就可以了)截取视图2中的前m[m=每页条数]条形成视图3,
InBlock.gif        视图3中的记录就是我们想要的结果;
InBlock.gif    ④若当前当前页码的2倍大于总页码,
InBlock.gif        则按排序规则截取后n[n=总记录-(当前页码-1)*每页条数]条记录形成视图1(实际操作是反转排序规则,取前n条),
InBlock.gif        然后按默认排序规则截取视图1中的前m[m=每页条数]条形成视图2
InBlock.gif        视图2中的记录就是我们想要的结果。
InBlock.gif*****************************************************************************************
ExpandedBlockEnd.gif
*/

None.gif
CREATE Procedure [dbo].[Common_OrderUpend_Pagination]
None.gif    
@PageCurr int=1,  --当前页码
None.gif
     @PageSize int=10,  --每页条数
None.gif
     @QueryString varchar(5000), --查询字符串
None.gif
     @OrderString varchar(5000), --排序规则
None.gif
     @FieldShow varchar(5000), --要显示的字段
None.gif
     @RecordCount int output  --总记录条数
None.gif
AS
None.gif    
Declare @intResult Int
None.gif    
Begin Tran
None.gif    
-----------------------------------------------------------------代码设计--------------------------------------------------------------------
None.gif
    declare @ViewName varchar(100)  --临时查询视图名称
None.gif
    set @ViewName = 'tempView'
None.gif    
declare @RecordQuery varchar(5000--记录查询
None.gif
    declare @OrderUpend varchar(5000--排序规则反转
None.gif
    
None.gif    
if(@FieldShow='' or @FieldShow=null)
None.gif         
set @FieldShow='*'
None.gif    
if(@PageCurr=0 or @PageCurr=null)
None.gif        
set @PageCurr=1
None.gif    
if(@PageSize=0 or @PageSize=null)
None.gif        
set @PageSize=10
None.gif     
None.gif    
if(@OrderString='' or @OrderString=null)
None.gif    
begin
None.gif        
print('Err:必须设置排序规则--')
None.gif           
return
None.gif    
end
None.gif    
None.gif     
--反转排序规则开始--
None.gif
    ifcharindex(',',@OrderString)=0 )
None.gif    
begin
None.gif        
if(charindex(' desc',@OrderString)=0)
None.gif                
set @OrderUpend=replace(@OrderString,' asc',''+ ' desc'     
None.gif           
else
None.gif                
set @OrderUpend=replace(@OrderString,' desc','')
None.gif     
end
None.gif     
else
None.gif     
begin
None.gif        
set @OrderUpend=''
None.gif           
declare @strSingle varchar(100)
None.gif           
declare @strTemp varchar(1000)
None.gif           
declare @strSpace varchar(10)
None.gif           
set @strSpace=''
None.gif           
set @strTemp=@OrderString
None.gif    
None.gif           
while @strTemp<>''
None.gif           
begin
None.gif                
if(charindex(',',@strTemp)=0)
None.gif                 
begin
None.gif                      
set @strSingle=@strTemp
None.gif                      
set @strTemp=''
None.gif                 
end
None.gif                
else
None.gif                 
begin
None.gif                      
set @strSingle=substring(@strTemp,1,charindex(',',@strTemp)-1)
None.gif                      
set @strTemp=substring(@strTemp,charindex(',',@strTemp)+1,8000)
None.gif                 
end
None.gif        
None.gif                
if(charindex(' desc',@strSingle)=0)
None.gif                     
set @strSingle=replace(@strSingle,' asc','')+' desc'     
None.gif                
else
None.gif                     
set @strSingle=replace(@strSingle,' desc','')
None.gif                
print(@strSingle)
None.gif               
set @OrderUpend=@OrderUpend+@strSpace+@strSingle
None.gif                
set @strSpace=','
None.gif           
end
None.gif      
end
None.gif     
--反转排序规则结束--
None.gif
     --print('排序规则:'+@OrderString)
None.gif
     --print('反 转 后:'+@OrderUpend)
None.gif
    
None.gif      
--统计记录数开始--
None.gif
    create table #tempTBcount(myCount int
None.gif    
exec('insert into #tempTBcount select count(0) from ( '+@QueryString+' ) '+@ViewName+'')
None.gif    
select @RecordCount=mycount from #tempTBcount drop table #tempTBcount
None.gif     
--统计记录数结束--
None.gif
    
None.gif    
declare @PageCount int --总页数 
None.gif
    declare @PassRecordCount int --预先取出的记录数 
None.gif
    if(@RecordCount%@PageSize=0)
None.gif          
set @PageCount=@RecordCount/@PageSize
None.gif    
else
None.gif        
set @PageCount=(@RecordCount-@RecordCount%@PageSize)/@PageSize+1
None.gif    
None.gif    
if (@PageCurr=1)
None.gif    
begin
None.gif        
set @RecordQuery='select top '+CONVERT(nvarchar@PageSize)+' '+@FieldShow+' from ('+ @QueryString+''+@ViewName+'_1 order by '+@OrderString
None.gif          
--print('只是显示第一页数据')
None.gif
          --print('实际执行的查询为:'+@RecordQuery)
None.gif
          exec(@RecordQuery)
None.gif     
end else if(@PageCurr>@PageCount)
None.gif    
begin
None.gif        
set @RecordQuery='select top 0 '+@FieldShow+' from('+@QueryString+''+@ViewName
None.gif          
--print('总记录显示不了这么多页')
None.gif
          --print('实际执行的查询为:'+@RecordQuery)
None.gif
          exec(@RecordQuery)
None.gif        
return @@rowcount
None.gif    
end
None.gif    
else if(@PageCurr * 2<=@PageCount)
None.gif    
begin
None.gif          
set @PassRecordCount=@PageCurr*@PageSize
None.gif          
set @RecordQuery=' select top '+CONVERT(nvarchar@PageSize)+' '+@FieldShow+' from (  '+
None.gif            
'select top '+ CONVERT(nvarchar@PageSize+' * from ( '+
None.gif                
'select top '+ CONVERT(nvarchar@PassRecordCount+' * from ( '+
None.gif                
@QueryString+' ) '+@ViewName+'_1 order by '+@OrderString+
None.gif                
''+@ViewName+'_2 order by '+@OrderUpend+
None.gif               
''+@ViewName+'_3 order by '+@OrderString
None.gif          
--print('头部截取')
None.gif
          --print('实际执行的查询为:'+@RecordQuery)
None.gif
          exec(@RecordQuery)
None.gif        
return @@rowcount
None.gif    
end
None.gif    
else
None.gif    
begin
None.gif        
set @PassRecordCount=@RecordCount-(@PageCurr-1)*@PageSize
None.gif          
set @RecordQuery=' select top '+CONVERT(nvarchar@PageSize)+' '+@FieldShow+' from (  '+
None.gif               
'select top '+ CONVERT(nvarchar@PassRecordCount+' * from ( '+
None.gif                
@QueryString+' ) '+@ViewName+'_1 order by '+@OrderUpend+
None.gif               
''+@ViewName+'_2 order by '+@OrderString
None.gif          
--print('尾部截取')
None.gif
         --print('实际执行的查询为:'+@RecordQuery)
None.gif
          exec(@RecordQuery)
None.gif        
return @@rowcount
None.gif    
end
None.gif    
--print @RecordQuery
None.gif
    Set @intResult = @@ROWCOUNT
None.gif    
----------------------------------------------------------------------------------------------------------------------------------------------------
None.gif
    If @@Error <> 0
None.gif    
Begin
None.gif        
RollBack Tran
None.gif        
Return -1
None.gif    
End
None.gif    
Else
None.gif    
Begin
None.gif        
Commit Tran
None.gif        
Return @intResult
None.gif    
End
None.gif
GO
None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值