存储过程 实现分页功能

 CREATE  proc dbo.CrmPageGetPagesByMoreField
 @FieldList nvarchar( 3000 ), --取出的列
 @TableName nvarchar( 1000 ), --表名
 @Filter  nvarchar( 3000 ), --搜索条件
 @OrderList nvarchar( 3000 ), --排序字段 , 按主键顺序排列
 @KeyName nvarchar( 200 ), --主键的字段名称
 @CurrentPage int,   --当前页,从0开始
 @PageSize int,   --每页的页数  
 @RecordCount int out,  --总的记录数
 @PageCount int out   --总的页数
as
 Declare @sqlStr nvarchar( 4000 ) --查询语句

 Declare @strGetRecordCount nvarchar(4000)--得到记录数的语句

 --如果没有指定@Filter , 用一个恒定表达式
 if @Filter = ''
 begin
  set @Filter = ' 1 > 0 '
 end
 
 set @strGetRecordCount = 'select @RecordCount = count( distinct '+ @KeyName + ') from ' + @TableName + ' where ' + @Filter
 exec sp_executesql  @strGetRecordCount ,
    N'@RecordCount int out',
    @RecordCount out

 if @PageSize = -1
 begin
  set @PageSize = @RecordCount
 end
 
 --取出总的页数
 if @RecordCount !=0
 begin
  set @PageCount = ceiling( @RecordCount*1.0 / @PageSize )
 end
 else
 begin
  set @PageCount = 0
 end

 if @PageCount != 0
 begin
  if  @CurrentPage >= @PageCount
  begin
   set @CurrentPage = @PageCount -1
  end
 end

 --如果没有指定取出多少列,则取出所有的
 if @FieldList = ''
 begin
  set @FieldList = ' * '
 end

 if @OrderList = ''
 begin
  set @OrderList = @KeyName + ' asc '
 end

 if @RecordCount > 0
 begin
  set @sqlStr = ' select top ' + Convert( nvarchar( 50 ) , @PageSize )+ @FieldList + ' from ' + @TableName
 
  set @sqlStr = @sqlStr + ' where ' + @KeyName + ' not in ' + ' ( select top ' + Convert( nvarchar( 50 ) , @PageSize * @CurrentPage ) + @KeyName + ' from ' + @TableName + ' where ' + @Filter + ' order by ' + @OrderList + ' ) and ' + @Filter + ' order by ' +  @OrderList
 end
 else
 begin
  set @sqlStr= ' select top ' +  Convert( nvarchar( 50 ) , @PageSize )+ ' '+ @FieldList + '  from ' + @TableName +  ' where ' + @Filter  + ' order by ' +  @OrderList
 end

 print @sqlStr
 exec( @sqlStr )


GO

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值