几个分页存储过程

方法一:

使用了set rowcount的方法

CREATE proc CrmGetTest1
 @CurrentPage int, --当前页,从0开始
 @PageSize int --页的长度
as
 Declare @Count  int --执行多少次
 Declare @ID int --ID的编号
  
 set @Count = @PageSize * @CurrentPage + 1

 set rowcount @Count
 
 select @ID = ID
 from test
 order by ID asc

 set rowcount @PageSize

 select *
 from test
 where ID >= @ID
 order by ID asc

 set rowcount 0

GO 

缺点:无法使用重复数据的排序方法,而且对于不是递增的列好象也不适用。

方法二:

使用了not in 的方法

CREATE proc CrmGetTest2
 @CurrentPage int, --当前页,从0开始
 @PageSize int --页长度
as
 declare @sql nvarchar( 1000 )
 set @sql = ' select top ' + Convert( nvarchar( 50 ) , @PageSize ) + ' id from test where id not in ( select top ' +  Convert( nvarchar( 50 ) , ( @PageSize * @CurrentPage ) ) + ' id from test order by id asc ) order by id asc '

 print ( @sql )
 exec ( @sql )

GO

缺点:可以使用任意的排序方法,但是效率不高。

方法三:

使用了>max(id)的方法

CREATE proc CrmGetTest3
 @CurrentPage int, --当前页,从0开始
 @PageSize int --页长度
as
 declare @sql nvarchar( 1000 )
 
 --第一页
 if @CurrentPage = 0
 begin
  set @sql = ' select top ' + Convert( nvarchar( 50 ) , @PageSize ) + ' id from test order by id '
 end
 else
 begin
  set @sql = ' select top ' + Convert( nvarchar( 50 ) , @PageSize )  + ' id from test where id > ( select max( id ) from ( select top '+ Convert( nvarchar( 50 ) , ( @PageSize * @CurrentPage ) )  + ' id from test order by id ) as T ) order by id '
 end
 print ( @sql )
 exec( @sql )

GO

缺点:无法使用重复数据的排序方法,而且对于不是递增的列好象也不适用。

方法四:

使用了临时表的方法

CREATE proc CrmGetTest4
 @CurrentPage int, --当前页,从0开始
 @PageSize int --页长度
as
 declare @sql nvarchar( 1000 )
 declare @RecordCount int --总的记录数

 select @RecordCount = count( * )
 from test

 set @sql = ' select top ' + Convert( nvarchar( 50 ) , @PageSize ) + ' id from ( select top ' + Convert( nvarchar( 50 ) , ( @RecordCount - @PageSize * @CurrentPage  ) ) + ' id from test order by id desc ) as TempTable order by id asc '

 print ( @sql )
 exec( @sql )

GO

缺点:可以进行多关键字的排序,只要把临时表里面的字段的排序方式全部反过来即可,但是效率不是很高

         另外还可以采用游标和新增一个字段rowid,让其递增,使用rowid between and 的方法,但是我觉得效率都一般。我觉得SQL_Server 可以增加一个伪列,每次筛选以后都是从1到最后的编号,这样就不需要进行分页的讨论了。^_^ 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值