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

被折叠的 条评论
为什么被折叠?



