标题: 实现千万级数据的分页显示
ljjk5
元帅
Rank: 1


荣誉会员奖章
UID 46706
精华 1
积分 99426
帖子 49690
威望 554
金币 48489
热心 505
阅读权限 100
注册 2007-2-25
状态 离线
实现千万级数据的分页显示

这是经我该写后的存储过程
---------------------------------------------------------
ALTER PROCEDURE usp_GetRecordFromPage
  @tblName   varchar(1000),    -- 表名
  @SelectFieldName    varchar(4000),   -- 要显示的字段名(不要加select)
  @strWhere   varchar(4000),   -- 查询条件(注意: 不要加 where)
  @OrderFieldName   varchar(255), -- 排序索引字段名
  @PageSize   int ,   -- 页大小
  @PageIndex     int = 1,     -- 页码
  @iRowCount     int output, -- 返回记录总数
  @OrderType     bit = 0     -- 设置排序类型, 非 0 值则降序

AS

declare @strSQL  varchar(4000) -- 主语句
declare @strTmp  varchar(4000)   -- 临时变量
declare @strOrder  varchar(400)   -- 排序类型
declare @strRowCount   nvarchar(4000)   -- 用于查询记录总数的语句

set @OrderFieldName=ltrim(rtrim(@OrderFieldName))

if @OrderType != 0
begin
  set @strTmp = '<(select min'
  set @strOrder = ' order by ' + @OrderFieldName +' desc'
end
else
begin
  set @strTmp = '>(select max'
  set @strOrder = ' order by ' + @OrderFieldName +' asc'
end

set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
  + @tblName + ' where ' + @OrderFieldName + @strTmp + '('
  + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
  + @OrderFieldName + ' from ' + @tblName  + @strOrder + ') as tblTmp)'
  + @strOrder

if @strWhere != ''
  set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
  + @tblName + ' where ' + @OrderFieldName + @strTmp + '('
  + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
  + @OrderFieldName + ' 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) + @SelectFieldName+' from '
  + @tblName + @strTmp + ' ' + @strOrder
end

exec(@strSQL)

if @strWhere!=''
begin
  set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere
end
else
begin
  set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName
end

exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out

顶部
[广告] 免费域名(Free Subdomain) 免费空间(Free hosting) PR查询(Google Pagerank)



当前时区 GMT+8, 现在时间是 2008-12-5 19:08
信产部ICP备案:京ICP备05066424号 北京市公安局网监备案:1101050648号

Powered by Discuz! 5.5.0
清除 Cookies - 联系我们 - 网友俱乐部 - Archiver - WAP