SQL 2005 分页存储过程

-- =============================================
-- Description:     <高效分页存储过程,适用于Sql2005以上>
-- Notes:         <排序字段强烈建议建索引>
-- Page2005'dyj_vclient','client_id,last_dt','client_id','last_dt','desc','',20,1,0
-- =============================================
CREATE Procedure [dbo].[sp_page] 
  @TableName varchar(2000),           --表名
  @Fields varchar(2000) = '*',      --字段名(全部字段为*)
  @PrimaryKey varchar(50),           --主键
  @OrderField varchar(500),         --排序字段(必须!支持多字段)
  @sqlWhere varchar(500) = Null,  --条件语句(不用加where)
  @pageSize int,                     --每页多少条记录
  @pageIndex int = 1 ,               --指定当前为第几页
  @TotalPage int output             --返回总页数 
as
begin
 
    Begin Tran --开始事务
 
    Declare @sqlnvarchar(4000);
    Declare @totalRecordint;    
    ifisnull(@PrimaryKey,'')=''
        set @PrimaryKey='*'
    --计算总记录数
         
    if (@SqlWhere='' or@sqlWhere=NULL)
        set @sql = 'select @totalRecord = count('+@PrimaryKey +') from ' + @TableName
    else
        set @sql = 'select @totalRecord = count('+@PrimaryKey +') from ' + @TableName + ' where ' + @sqlWhere
 
    EXEC sp_executesql@sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       
     
    --计算总页数
    select@TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
 
    if (@SqlWhere='' or@sqlWhere=NULL)
        set @sql = 'Select * FROM (select ROW_NUMBER()Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from '+ @TableName 
    else
        set @sql = 'Select * FROM (select ROW_NUMBER()Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from '+ @TableName + ' where ' + @SqlWhere    
         
     
    --处理页数超出范围情况
    if@PageIndex<=0 
        Set @pageIndex = 1
     
    if@pageIndex>@TotalPage
        Set @pageIndex = @TotalPage
 
      --处理开始点和结束点
    Declare @StartRecordint
    Declare @EndRecordint
     
    set @StartRecord =(@pageIndex-1)*@PageSize + 1
    set @EndRecord =@StartRecord + @pageSize - 1
 
    --继续合成sql语句
    set @Sql = @Sql + ') as[page_result_table] where rowId between ' +Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
     
    Exec(@Sql)
    ---------------------------------------------------
    If @@Error<> 0
      Begin
        RollBack Tran
        Return -1
      End
      Else
      Begin
        Commit Tran
        Return @totalRecord ---返回记录总数
      End   
end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值