• 存储过程分页


    IF EXISTS ( SELECT *FROM INFORMATION_SCHEMA.ROUTINES  WHERE SPECIFIC_NAME = 'GetRecordsPagination')
    DROP PROCEDURE GetRecordsPagination

    GO

    CREATE PROCEDURE GetRecordsPagination
    (
        
    @tableName            varchar(256),       -- 进行分页表名
        @columnName            varchar(256),        -- 用作分页的字段名
        @pageSize            int = 10,           -- 每页记录数 (默认是10)
        @pageIndex            int = 1,            -- 页码 (默认第一页)
        @sortType            bit = 0,            -- 数据查找排序类型
                                                -- 0 升序,1 降序 (默认 0)
        @visibleColumns        varchar(2000= '',    -- 要返回的字段,格式"A1,B1,C1" (若为空,则返回全部)
        @sqlCondition        varchar(2000= ''-- 附加查询条件 (不包含'where'字串)     
        @orderByColumn        varchar(256= '',    -- 记录最后排序OrderBy的字段 (默认等于@columnName)
        @orderBySortType    bit = 0                -- 记录最后排序类型
                                                -- 0 升序,1 降序 (默认 0)
    )
    AS

    declare @strSQL            varchar(8000)        -- 最终合成的SQL语句
    declare @strTemp        varchar(256)        -- 临时字符串
    declare @strOrderBy        varchar(1000)       -- 查找排序类型子句

    -- 设置数据查找排序类型子句
    if @sortType != 0
    begin
        
    set @strTemp = '<(select min'
        
    set @strOrderBy = ' order by [' + @columnName + '] desc'
    end
    else
    begin
        
    set @strTemp = '>(select max'
        
    set @strOrderBy = ' order by [' + @columnName +'] asc'
    end

    -- 设置要返回字段
    if @visibleColumns = ''
        
    set  @visibleColumns = ' * '

    -- 设置查找语句
    set @strSQL = 'select top ' + str(@pageSize+ ' ' + @visibleColumns + '  from ['
        
    + @tableName + '] where [' + @columnName + ']' + @strTemp + '(['
        
    + @columnName + ']) from (select top ' + str((@pageIndex-1)*@pageSize+ ' ['
        
    + @columnName + '] from [' + @tableName + ']' + @strOrderBy + ') as TempTable)'
        
    + @strOrderBy

    -- 添加附加查询条件
    if @sqlCondition != ''
        
    set @strSQL = 'select top ' + str(@pageSize+ ' ' + @visibleColumns + '  from ['
            
    + @tableName + '] where [' + @columnName + ']' + @strTemp + '(['
            
    + @columnName + ']) from (select top ' + str((@pageIndex-1)*@pageSize+ ' ['
            
    + @columnName + '] from [' + @tableName + '] where ' + @sqlCondition + ' '
            
    + @strOrderBy + ') as TempTable) and ' + @sqlCondition + ' ' + @strOrderBy

    -- 优化第一页查询
    if @pageIndex = 1
    begin
        
    set @strTemp = ''
        
    if @sqlCondition != ''
            
    set @strTemp = ' where (' + @sqlCondition + ')'

        
    set @strSQL = 'select top ' + str(@pageSize+ ' ' + @visibleColumns + '  from ['
            
    + @tableName + ']' + @strTemp + ' ' + @strOrderBy
    end

    -- 设置自定义输出OrderBy
    if @orderByColumn != ''
    begin
        
    set @strTemp = @strSQL
        
    if @orderBySortType = 0 
            
    set @strSQL =  ' select * from ( ' + @strTemp + ' ) as TempTable2 order by ['
                
    + @orderByColumn + '] asc' 
        
    else
            
    set @strSQL =  ' select * from ( ' + @strTemp + ' ) as TempTable2 order by ['
                
    + @orderByColumn + '] desc'
    end  

    --测试生成的SQL语句
    --PRINT @strSQL

    exec (@strSQL)


     2.有使用ROW_NUMBER()的存储过程

    /***********************************************************************
    文件名:            GetRecordsPaginationWithRowNumber.sql
    功能:                创建存储过程GetRecordsPaginationWithRowNumber
                        [
    注:运用SQL 2005新增函数ROW_NUMBER(),有局限性!]
    ***********************************************************************/


    IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES  WHERE SPECIFIC_NAME = 'GetRecordsPaginationWithRowNumber')
    DROP PROCEDURE GetRecordsPaginationWithRowNumber

    GO

    CREATE PROCEDURE GetRecordsPaginationWithRowNumber
    (
        
    @tableName            varchar(256),       -- 进行分页表名
        @columnName            varchar(256),        -- 用作分页的字段名
        @pageSize            int = 10,           -- 每页记录数 (默认是10)
        @pageIndex            int = 1,            -- 页码 (默认第一页)
        @sortType            bit = 0,            -- 数据查找排序类型
                                                -- 0 升序,1 降序 (默认 0)
        @visibleColumns        varchar(2000= '',    -- 要返回的字段,格式"A1,B1,C1" (若为空,则返回全部)
        @sqlCondition        varchar(2000= ''-- 附加查询条件 (不包含'where'字串)     
        @orderByColumn        varchar(256= '',    -- 记录最后排序OrderBy的字段 (默认等于@columnName)
        @orderBySortType    bit = 0                -- 记录最后排序类型
                                                -- 0 升序,1 降序 (默认 0)
    )
    AS

    declare @strSQL            varchar(8000)        -- 最终合成的SQL语句
    declare @strTemp        varchar(256)        -- 临时字符串
    declare @strOrderBy        varchar(1000)       -- 查找排序类型子句

    -- 设置数据查找排序类型子句
    if @sortType != 0
    begin
        
    set @strOrderBy = ' order by [' + @columnName + '] desc'
    end
    else
    begin
        
    set @strOrderBy = ' order by [' + @columnName +'] asc'
    end

    -- 设置要返回字段
    if @visibleColumns = ''
        
    set  @visibleColumns = ' * '

    -- 设置查找语句
    set @strSQL = 'select top ' + str(@pageSize+ ' ' + @visibleColumns  
                    
    + ' from ( select * , ROW_NUMBER() Over ( ' 
                    
    + @strOrderBy + ' ) as RowNum from [' + @tableName + '] ) as TempTable '
                    
    + ' where RowNum between ' + str( (@pageIndex-1* @pageSize ) 
                    
    + ' and ' + str@pageIndex * @pageSize )

    -- 添加附加查询条件
    if @sqlCondition != ''
        
    set @strSQL = 'select top ' + str(@pageSize+ ' ' + @visibleColumns 
                    
    + ' from ( select * , ROW_NUMBER() Over ( ' 
                    
    + @strOrderBy + ' ) as RowNum from [' + @tableName + '] where '
                    
    + @sqlCondition + ' ) as TempTable '
                    
    + ' where RowNum between ' + str( (@pageIndex-1* @pageSize ) 
                    
    + ' and ' + str@pageIndex * @pageSize )

    -- 优化第一页查询
    if @pageIndex = 1
    begin
        
    set @strTemp = ''
        
    if @sqlCondition != ''
            
    set @strTemp = ' where (' + @sqlCondition + ')'

        
    set @strSQL = 'select top ' + str(@pageSize+ ' ' + @visibleColumns + '  from ['
            
    + @tableName + ']' + @strTemp + ' ' + @strOrderBy
    end

    -- 设置自定义输出OrderBy
    if @orderByColumn != ''
    begin
        
    set @strTemp = @strSQL
        
    if @orderBySortType = 0 
            
    set @strSQL =  ' select * from ( ' + @strTemp + ' ) as TempTable2 order by ['
                
    + @orderByColumn + '] asc' 
        
    else
            
    set @strSQL =  ' select * from ( ' + @strTemp + ' ) as TempTable2 order by ['
                
    + @orderByColumn + '] desc'
    end  

    --测试生成的SQL语句
    PRINT @strSQL

    exec (@strSQL)

  • 相关阅读:
    log4j/log4e的使用
    数据库主键不应该具有任何业务意义
    孔雀森林,何时开屏
    spring + hibernate
    JAVA的运行时类型识别(RTTI)
    开年感想,2005年总结
    iphone真机(越狱)通讯录导入进模拟器
    xcode中工程引用设置
    UIButton setImage 图片大小选择
    加密技术资源
  • 原文地址:https://www.cnblogs.com/jackrebel/p/1201354.html
Copyright © 2020-2023  润新知