天天看点

实现千万级数据分页的存储过程

实现千万级数据分页的存储过程

CREATE PROCEDURE GetRecordFromPage

    @tblName      varchar(255),       -- 表名

    @fldName      varchar(255),       -- 字段名

    @fldIndex     varchar(255)='',    -- 无重复索引字段

    @PageSize     int = 10,           -- 页尺寸

    @PageIndex    int = 1,            -- 页码

    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序

    @strWhere     varchar(2000) = ''  -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL   varchar(6000)       -- 主语句

declare @strTmp   varchar(1000)       -- 临时变量

declare @strOrder varchar(500)        -- 排序类型

declare @strField varchar(1000)       -- 用来联合的字段

if @PageIndex < 1

    return

set @strField = '[' + @fldName + ']'

-- 计算后的数据精确到小数点后 33 位

if @fldIndex != ''

    set @strField = ' convert(numeric(38,33), [' + @fldName

        + ']) + convert(numeric(38,33), [' + @fldIndex

        + '] / 10000000000000000000000000000) '

if @OrderType != 0

begin

    set @strTmp = '<(select min'

    set @strOrder = ' order by ' + @strField + ' desc'

end

else

begin

    set @strTmp = '>(select max'

    set @strOrder = ' order by ' + @strField + ' asc'

end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

    + @tblName + '] where ' + @strField + @strTmp

    + '(tmpIndex) from (select top ' + str((@PageIndex-1)*@PageSize) + @strField

    + ' tmpIndex from [' + @tblName + ']' + @strOrder + ') as tblTmp)'

    + @strOrder

if @strWhere != ''

    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

        + @tblName + '] where ' + @strField + @strTmp

        + '(tmpIndex) from (select top ' + str((@PageIndex-1)*@PageSize) + @strField

        + ' tmpIndex from [' + @tblName + '] where ' + @strWhere + ' '

        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1

begin

    set @strTmp = ''

    if @strWhere != ''

        set @strTmp = ' where (' + @strWhere + ')'

    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

        + @tblName + ']' + @strTmp + ' ' + @strOrder

end

exec (@strSQL)

GO

继续阅读