通用分页存储过程 采用ROW_NUMBER(),支持2005及以后的版本

--通用分页存储过程 采用ROW_NUMBER(),支持2005及以后的版本
CREATE PROCEDURE PR_PAGE
    @TableName varchar( 5000), --要进行分页的表,也可以用联接,如dbo.employee或dbo.employee INNER JOIN dbo.jobs ON (dbo.employee.job_id=dbo.jobs.job_id)
    @Fields varchar( 5000), --表中的字段,可以使用*代替
    @OrderField varchar( 5000), --要排序的字段
    @SqlWhere varchar( 5000), --WHERE子句
    @PageSize  int, --分页的大小
    @PageIndex  int, --要显示的页的索引
    @TotalPage  int  --页的总数
    --@TotalPage  int output --页的总数
 AS
 BEGIN
     --BEGIN TRAN
     
     DECLARE @sql NVARCHAR( 4000);
     DECLARE @totalRecord INT ; --记录总数
     
     IF(@SqlWhere IS NULL or @SqlWhere =  '')
        SET @SqlWhere= ''
     ELSE
        SET @SqlWhere= '  WHERE  '+@SqlWhere
    
     --利用WHERE子句进行过滤
     SET @sql =  ' SELECT @totalRecord = COUNT(1) FROM  ' + @TableName + @SqlWhere
  
     --执行sql语句得到记录总数
     EXEC sp_executesql @sql,N ' @totalRecord int OUTPUT ',@totalRecord OUTPUT
 
     SELECT @TotalPage=CEILING((@totalRecord+ 0.0)/@PageSize)
 
     --根据特定的排序字段为为行分配唯一ROW_NUMBER的顺序
     SET @sql =  ' SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY  ' + @OrderField +  ' ) AS rowId, ' + @Fields +  '  FROM  ' + @TableName + @SqlWhere

     --确保当前页的索引在合理的范围之内
     IF @PageIndex<= 0
        Set @PageIndex =  1
     IF @PageIndex>@TotalPage
        SET @PageIndex = @TotalPage
 
     --得到当前页在整个结果集中准确的ROW_NUMBER值
     DECLARE @StartRecord INT
     DECLARE @EndRecord INT
     SET @StartRecord = (@PageIndex- 1)*@PageSize +  1
     SET @EndRecord = @StartRecord + @PageSize -  1
 
     --输出当前页中的数据
     SET @Sql = @Sql +  ' ) AS t ' +  '  WHERE rowId BETWEEN  ' + Convert(varchar( 50),@StartRecord) +  '  AND  ' +   Convert(varchar( 50),@EndRecord)
     EXEC(@Sql)
     SELECT @totalRecord
     --IF @@Error <>  0
     --   BEGIN
     --       ROLLBACK TRAN  
     --       RETURN - 1 
     --   END 
     --ELSE 
     --   BEGIN 
     --       Commit TRAN 
     --       RETURN @totalRecord
     --   END
 END
 
EXEC PR_PAGE  ' Student inner join Sex on Student.sexid=sex.sexid ', ' ID,Code,Name,Age,Birthday ', ' ID desc ', ' STUDENT.SEXID=0 ', 10, 10000, 0
 
--DECLARE @TotalPage INT
--EXEC PR_PAGE  ' Student inner join Sex on Student.sexid=sex.sexid ', ' ID,Code,Name,Age,Birthday ', ' ID desc ', ' STUDENT.SEXID=0 ', 10, 10000,@TotalPage OUTPUT
--SELECT @TotalPage

转载于:https://www.cnblogs.com/puke/archive/2012/09/04/2670180.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值