几个分页存储过程

来源:互联网 发布:美丽档案淘宝官网 编辑:程序博客网 时间:2024/04/29 20:28

方法一:

使用了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到最后的编号,这样就不需要进行分页的讨论了。^_^ 

原创粉丝点击