千万级高性能分页存储过程

(原文来自于海乐学习-http://www.cnblogs.com/hailexuexi/archive/2010/07/25/1784508.html)

Create  procedure   [dbo].[QueryPagination]

    @TableName       varchar(1000),        -- 表名

    @SelectFieldName    varchar(4000),     -- 要显示的字段名(不要加select)

    @strWhere       varchar(4000),         -- 查询条件(注意: 不要加 where)

    @OrderFieldName      varchar(255),     -- 排序索引字段名

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

    @PageSize       int ,                  -- 页大小

    @PageIndex      int = 1,               -- 页码

    @iRowCount      int output             -- 返回记录总数

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 '

    + @TableName + ' where ' + @OrderFieldName + @strTmp + '('

    + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)

    + @OrderFieldName + ' from ' + @TableName + @strOrder + ') as tblTmp)'

    + @strOrder

if @strWhere != ''

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

        + @TableName + ' where ' + @OrderFieldName + @strTmp + '('

        + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)

        + @OrderFieldName + ' from ' + @TableName + ' 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 '

        + @TableName + @strTmp + ' ' + @strOrder

end

exec(@strSQL)

if @strWhere!=''

begin

set @strRowCount = 'select @iRowCount=count(*) from ' + @TableName+' where '+@strWhere

end

else

begin

set @strRowCount = 'select @iRowCount=count(*) from ' + @TableName

end

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

posted @ 2011-09-14 14:17  银色奇迹  阅读(245)  评论(0编辑  收藏  举报