zoukankan      html  css  js  c++  java
  • 分页存储过程总结

    /*********************************************************************/
    /*       MSSQL分页:一个高效的二分法TOP MAX/TOP MIN分页存贮过程      */
    /*                        2010/07/09                                 */
    /*                         Leo.wl                                    */
    /*********************************************************************/
    CREATE PROCEDURE [dbo].[getPagerTopMAX] (
        @tblName     nvarchar(2000),           ----要显示的表或多个表的连接,如:"myTable"
        @ID        nvarchar(150),            ----主表的主键,如:"id"
        @page        int = 1,                ----要显示那一页的记录
        @pageSize    int = 10,                ----每页显示的记录个数
        @fldName     nvarchar(500) = '*',        ----要显示的字段列表,如:"id, cdsinger, cdsingertype, area, cdsingerreadme"
        @fldSort    nvarchar(200) = @ID,       ----排序字段列表或条件
        @Sort        bit = 1,                ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
        @strCondition    nvarchar(1000) = null, ----查询条件,不需where,如:"and a=1 and b=2"
        @Dist                 bit = 0,          ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
        @Counts    int = 1 output,              ----查询到的记录数
        @pageCount    int = 1 output            ----查询结果分页后的总页数
    ) AS begin
        SET NOCOUNT ON
        Declare @sqlTmp nvarchar(3000)           ----存放动态生成的SQL语句
        Declare @strTmp nvarchar(3000)            ----存放取得查询结果总数的查询语句
        Declare @strID     nvarchar(3000)       ----存放取得查询开头或结尾ID的查询语句
    
        Declare @strSortType nvarchar(10)        ----数据排序规则A
        Declare @strFSortType nvarchar(10)        ----数据排序规则B
    
        Declare @SqlSelect nvarchar(50)         ----对含有DISTINCT的查询进行SQL构造
        Declare @SqlCounts nvarchar(50)         ----对含有DISTINCT的总数查询进行SQL构造
    
    
        if @Dist  = 0
        begin
            set @SqlSelect = 'select '
            set @SqlCounts = 'Count(*)'
        end
        else
        begin
            set @SqlSelect = 'select distinct '
            set @SqlCounts = 'Count(DISTINCT '+@ID+')'
        end
    
    
        if @Sort=0
        begin
            set @strFSortType=' ASC '
            set @strSortType=' DESC '
        end
        else
        begin
            set @strFSortType=' DESC '
            set @strSortType=' ASC '
        end
    
    
    
        --------生成查询语句--------
    
        --此处@strTmp为取得查询结果数量的语句
        if @strCondition is null or @strCondition=''     --没有设置显示条件
        begin
            set @sqlTmp =  @fldName + ' From ' + @tblName
            set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
            set @strID = ' From ' + @tblName
        end
        else
        begin
            set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
            set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition
            set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
        end
    
        ----取得查询结果总数量-----
        exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
        declare @tmpCounts int
        if @Counts = 0
            set @tmpCounts = 1
        else
            set @tmpCounts = @Counts
    
            --取得分页总数
            set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize
    
            /**//**当前页大于总页数 取最后一页**/
            if @page>@pageCount
                set @page=@pageCount
    
            --/*-----数据分页2分处理-------*/
            declare @pageIndex int --总数/页大小
            declare @lastcount int --总数%页大小 
    
            set @pageIndex = @tmpCounts/@pageSize
            set @lastcount = @tmpCounts%@pageSize
            if @lastcount > 0
                set @pageIndex = @pageIndex + 1
            else
                set @lastcount = @pagesize
    
            --//***显示分页
            if @strCondition is null or @strCondition=''     --没有设置显示条件
            begin
                if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
                    begin 
                        if @page=1
                            set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(20))+' '+ @fldName+' from '+@tblName                        
                                +' order by '+ @fldSort +' '+ @strFSortType
                        else
                        begin                    
                            set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(20))+' '+ @fldName+' from '+@tblName
                                +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
                                +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)'
                                +' order by '+ @fldSort +' '+ @strFSortType
                        end    
                    end
                else
                    begin
                    set @page = @pageIndex-@page+1 --后半部分数据处理
                        if @page <= 1 --最后一页数据显示                
                            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(20))+' '+ @fldName+' from '+@tblName
                                +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
                        else
                            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(20))+' '+ @fldName+' from '+@tblName
                                +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
                                +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)'
                                +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
                    end
            end
    
            else --有查询条件
            begin
                if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
                begin
                        if @page=1
                            set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(20))+' '+ @fldName+' from '+@tblName                        
                                +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType
                        else
                        begin                    
                            set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(20))+' '+ @fldName+' from '+@tblName
                                +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
                                +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)'
                                +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType
                        end            
                end
                else
                begin 
                    set @page = @pageIndex-@page+1 --后半部分数据处理
                    if @page <= 1 --最后一页数据显示
                            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(20))+' '+ @fldName+' from '+@tblName
                                +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                     
                    else
                            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(20))+' '+ @fldName+' from '+@tblName
                                +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
                                +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)'
                                +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                
                end    
            end
    
        ------返回查询结果-----
        --print @strTmp
        exec (@strTmp)
    
    
        SET NOCOUNT OFF
    
    end
    /*********************************************************************/
    /*  MSSQL分页:查询前几页速度最快的ROW_NUMBER() OVER分页存贮过程     */
    /*                        2010/07/09                                 */
    /*                         Leo.wl                                    */
    /*********************************************************************/
    CREATE PROCEDURE [dbo].[getPagerROWOVER] 
        @PageIndex int = 1,
        @PageSize int = 10,
        @Tables nvarchar(1000) = NULL,
        @Fields nvarchar(2000) = '*',
        @Where nvarchar(2000) = NULL,
        @GroupBy nvarchar(2000) = NULL,
        @OrderBy nvarchar(1000) = NULL,
        @ReturnCount int = 0 OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
        declare @Sql nvarchar(4000),@startRowIndex int, @maximumRows int;
        declare @strWhere nvarchar(2000)
        declare @strGroupBy nvarchar(2000)
    
        set @startRowIndex = (@PageIndex - 1) * @PageSize;
        set @maximumRows = @PageSize;
    
        IF @Where IS NOT NULL AND @Where != ''
        BEGIN
            SET @strWhere = ' WHERE ' + @Where
        END
        ELSE
        BEGIN
            SET @strWhere = ''
        END
        IF @GroupBy IS NOT NULL AND @GroupBy != ''
        BEGIN
            SET @strGroupBy = ' GROUP BY ' + @GroupBy
        END
        ELSE
        BEGIN
            SET @strGroupBy = ''
        END
            
        set @Sql = 'select ' + @Fields + ' from (select ' + @Fields + ', ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') as rownum from ' + @Tables + @strWhere + @strGroupBy + ') as tmpTable where rownum > ' + CONVERT(nvarchar(10), @startRowIndex) + ' and rownum <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' + CONVERT(nvarchar(10), @maximumRows) + ')'
        exec(@Sql)
        print @sql
        set @Sql = 'select @ReturnCount=COUNT(*) from ' + @Tables + @strWhere
        exec sp_executesql @Sql,N'@ReturnCount int OUTPUT',@ReturnCount OUTPUT
        print @sql
    END
    
    /*********************************************************************/
    /*                    MSSQL分页:查询分页存贮过程                    */
    /*                        2010/07/09                                 */
    /*                         Leo.wl                                    */
    /*********************************************************************/
    CREATE     PROCEDURE [dbo].[Pagination_dongde_2]
    (
    @tab nvarchar(1000),---表名
    @strFld nvarchar(2500), --字段字符串
    @strWhere varchar(8000), --where条件 
    @Page int, --页码
    @RecsPerPage int, --每页容纳的记录数
    @ID VARCHAR(255), --需要排序的不重复的ID号
    @Sort VARCHAR(255), --排序字段及规则
    @isGetCount bit--是否得到记录总数
    )
    AS
    
    DECLARE @Str nVARCHAR(4000)
    
    declare @SQL nVARCHAR(4000) --不带排序语句的SQL语句
    set @SQL='select ' + @strFld + ' from '+ @tab +' where ' +@strWhere
    
    if(@isGetCount=0)
    begin
    
    SET @Str='SELECT TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM 
    ('+@SQL+') bb  WHERE bb.'+@ID+' NOT IN (SELECT TOP '+CAST((@RecsPerPage*(@Page-1)) 
    AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') aa  ORDER BY '+@Sort+') ORDER BY '+@Sort
    
    PRINT @Str
    
    end
    
    else
    begin
    
    SET @Str='select count('+@ID+') from '+ @tab + ' where ' +@strWhere
    
    PRINT @Str
    end
    
    EXEC sp_ExecuteSql @Str
    
  • 相关阅读:
    day25:接口类和抽象类
    vue1
    How the weather influences your mood?
    机器学习实验方法与原理
    How human activities damage the environment
    Slow food
    Brief Introduction to Esports
    Massive open online course (MOOC)
    Online learning in higher education
    Tensorflow Dataset API
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1774518.html
Copyright © 2011-2022 走看看