-- =============================================
-- Author:               
-- Create date: 2008-4-15
-- Description:        适合2005的分页存储过程 解决表内无排序分页唯一值的 分页问题
--                               
-- ReWriteer:  改进适合多字段排序
-- =============================================
CREATE PROCEDURE [dbo].[IB_SP_Pagination_LWF]
        @tblName                varchar(255),                        -- 表名
        @strGetFields        varchar(1000)        = '*',        -- 需要返回的列
        @OrderByStr varchar(255)='', -- 排序的字符串  例:order by id asc,name desc
        @PageSize                int                                = 10,        -- 页尺寸
        @PageIndex                int                                = 1,        -- 页码
        @doCount                bit                                = 1,        -- 返回记录总数, 非 0 值则返回
        @strWhere                varchar(1500)        = ''        -- 查询条件 (注意: 不要加 where)
AS
SET NOCOUNT ON
        declare @strSQL                varchar(5000)        -- 主语句

if @doCount <> 0 -- 如果@doCount传递过来的不是0,就执行总数统计。
begin
        if @strWhere <> '' -- 查询条件不为空时添加查询条件过滤数据
                set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere
        else
                set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
else
begin
        if @PageIndex < 1 -- 负数页索引时默认为1
                set @PageIndex = 1

        if @PageSize < 1 -- 负数页容量时默认为10
                set @PageSize = 10

        -- 利用row_number函数增加数据的次序标识
        set @strSQL = 'select * from (select row_number() over(' + @OrderByStr + ') rank,' + @strGetFields + ' from ' + @tblName + ''

        if @strWhere <> '' -- 查询条件不为空时要把原数据先过滤
                set @strSQL = @strSQL + ' where ' + @strWhere

        -- 必须添加别名;分页用between...and... ;
        set @strSQL = @strSQL + ') t where rank between ' + convert(varchar, (@PageIndex - 1) * @PageSize + 1) + ' and ' + convert(varchar, (@PageIndex * @PageSize))
end

exec (@strSQL)
posted on 2008-07-23 11:48  张学军  阅读(122)  评论(0)    收藏  举报