实现千万级数据的分页显示

80酷酷网    80kuku.com

  分页|数据|显示
这是经我该写后的存储过程
---------------------------------------------------------
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



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: