• 数据库分页存储过程(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
  • 相关阅读:
    Joint Consensus两阶段成员变更的单步实现
    深度干货|云原生分布式数据库 PolarDBX 的技术演进
    SpringMVC框架入门配置 IDEA下搭建Maven项目
    windows安装composer方法和使用方法
    idea2016 spring 新手上路
    jQuery 获取 attr() 与 prop() 属性值的方法及区别介绍 _fei
    处女座的看过来【 JetBrains强迫症】注释篇
    phpstorm 配置 xdebug调试工具
    使用Intellij IDEA整合Spring+Spring MVC+MyBitis
    长链剖分小记
  • 原文地址:https://www.cnblogs.com/zsy/p/311231.html
Copyright © 2020-2023  润新知