用TOP关键字的分页存储过程
说明:此存储过程仅适用于单主键,且主键可排序的情况,不适用于复合主键,因为复合主键会出现重复某一列的情况,再进行比较的话,得出的分页结果会是错误的。
下面是存储过程的代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
create proc Pager
@tablename varchar(80) , -- 表名
@str_OrderColumn varchar(50) , -- 待排序的字段名
@PageIndex int = 1, -- 页码
@PageSize int = 10, -- 页尺寸
@str_GetFields varchar(200) = '*',-- 要获取的字段名
@totalRecords int output -- 输出参数,计算记录总条数
as
Begin
Declare @strSql varchar(500)
DECLARE @SQL NVARCHAR(1000)
DECLARE @R BIGINT
SET @SQL= N'select @R=count(*) from '+@TableName
EXEC SP_EXECUTESQL @SQL, N' @R BIGINT OUTPUT', @R OUTPUT
SET @TotalRecords= @R -- 将总记录数赋予输出参数
if(@PageIndex =1) -- 如果为第一页
Begin
set @strSql='select top '+str(@PageSize)+' '+@str_GetFields+' from '+@tablename+' order by '+@str_OrderColumn
End
Else
set @strSql='select top '+str(@PageSize)+' '+@str_GetFields+' from '+@tablename+' where ('+@str_OrderColumn
+' >= (
select Max('+@str_OrderColumn+') from (
select top '+str((@PageSize)*(@PageIndex-1))+' * from '+@tablename+' order by '+@str_OrderColumn+' ) as tempTable
)
) order by '+ @str_OrderColumn
exec(@strSql)
end