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

来源:互联网 发布:网络八大虚拟人物名字 编辑:程序博客网 时间:2024/05/24 06:10

/*
  经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:
  exec GetRecordFromPage news,newsid,10,100000
  news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。
*/

/*
  函数名称: GetRecordFromPage
  函数功能: 获取指定页的数据
  参数说明: @tblName      包含数据的表名
           @fldName      关键字段名
           @PageSize     每页记录数
           @PageIndex    要获取的页码
           @OrderType    排序类型, 0 - 升序, 1 - 降序
           @strWhere     查询条件 (注意: 不要加 where)
  作  者: 铁拳
  邮  箱:
sunjianhua_kki@sina.com
  创建时间: 2004-07-04
  修改时间: 2004-07-04
*/
CREATE PROCEDURE GetRecordFromPage
    @tblName      varchar(255),       
-- 表名
    @fldName      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)        -- 排序类型

if @OrderType != 0
begin
    set @strTmp = '<(select min'
    set @strOrder = ' order by [' + @fldName + '] desc'
end
else
begin

    set @strTmp = '>(select max'
    set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
    + @strOrder

if @strWhere != ''
    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
        + @fldName + '] 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

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证过期在外地怎么办 三年驾校过期了怎么办 车年检过期半年怎么办 驾照过期未年检怎么办 驾驶证时间过了怎么办 驾证年审逾期怎么办 驾照a2扣分了怎么办 叉车年检过期了怎么办 部队驾驶证过期了怎么办 车检过期5天怎么办 b2被注销了怎么办 小车逾期未审验怎么办 汽车逾期未审验怎么办 对方无偿还能力怎么办 摩托车驾驶证年审过期怎么办 当兵父亲有前科怎么办 被动态监控了怎么办 学习驾驶证明过期怎么办 a2驾驶证扣分了怎么办 c1驾驶证脱审怎么办 摩托车驾驶证脱审怎么办 行车证到期了怎么办 外省驾驶证掉了怎么办 错过教师证体检怎么办? c3驾驶证怎么办c1证 驾驶证扣分18分怎么办 货车罚款单上没写金额怎么办 报名费驾校不退怎么办 异地学车暂住证怎么办 考驾照老是紧张怎么办 驾照老考不过怎么办 三轮摩托车行驶证怎么办 a2驾驶证附件假背扣怎么办 驾驶证扣分15分怎么办 烟草证副本丢失怎么办 身份证异地丢了怎么办 营业执照正本遗失了怎么办 换新驾照过期了怎么办 武汉暂住证过期了怎么办 驾照破损在异地怎么办 行车本丢了怎么办