[数据库] 通用分页存储过程
更新时间:2007年02月09日 00:00:00 作者:
以下这个是我自己写的一个分页通用存储过程
该方法也就是上头所提到的行计数的方式,在系统中使用发现过很多次问题,这是最终版本应该不会再有什么算法之类的问题出现了
这个存储过程的原理就是“譬如现在要第5页数据,每页是16行,那么现在要的数据就是在前80行,并且不在原来的64行内的”
复制代码 代码如下:
Create Proc proc_PageRecordset
@queryStr nvarchar(2000), --查询语句,用来获取要显示的数据必须满足的要求@keyField nvarchar (72), --主键
@pageSize int, --每页的行数@pageNumber int, --第几页
@filter varChar(2000)='', --过滤,where后头的语句
@order varChar(200)='' --排序方式AS
BEGIN
DECLARE @sqlText AS nvarchar(4000)
DECLARE @sqlTable AS nvarchar(4000)
DECLARE @sqlText_PageCount AS nvarchar(4000)
set @filter=replace(@filter,'#','''')
--这是最后一次所发现的bug,因为在排序中必须确定一个排出来的位置一样的table,不能让a在这次排第2,那次又排第5
if CharIndex(@keyField,@order)=0
Begin
Set @order=@order+','+@keyField
End
if (Rtrim(@filter)='')
begin
SET @sqlTable = 'SELECT TOP ' + CAST((@pageNumber + 1) * @pageSize AS varchar(30)) + ' ' + @queryStr + ' ' + @order
SET @sqlText_PageCount = 'Select Count(*) from (select ' +@queryStr+ ' ) as Table_temp'
end
else
begin
SET @sqlTable = 'SELECT TOP ' + CAST((@pageNumber + 1) * @pageSize AS varchar(30)) + ' ' + @queryStr + ' and ' + @filter + @order
SET @sqlText_PageCount = 'Select Count(*) AS MyCount from (select ' +@queryStr+ ' and ' + @filter +' ) as Table_temp'
end
--譬如现在要第5页数据,每页是16行,那么现在要的数据就是在前80行,并且不在原来的64行内的
SET @sqlText =
'SELECT TOP ' + CAST(@pageSize AS varchar(30)) + ' * ' +
'FROM (' + @sqlTable + ') AS tableA ' +
'WHERE ' + @keyField + ' NOT IN(SELECT TOP ' +
CAST(@pageNumber * @pageSize AS varchar(30)) + ' ' + @keyField +
' FROM (' + @sqlTable + ') AS tableB)'
EXEC (@sqlText)
exec (@sqlText_PageCount)
END
GO
相关文章
Sql Server、Access数据排名的实现方法(例如:成绩排名)
在很多时候,我们需要统计数据的排名情况,最常见的是成绩、投票数等等的。2009-06-06Maven nexus 安装nexus私服出现的问题和解决办法
本文主要介绍安装nexus私服的时候出现问题的解决办法,这里整理了两种问题并详细说明了解决办法,有需要的朋友可以参考下2016-08-08
最新评论