页面导航: 首页数据库数据库技巧 → 正文内容

[数据库] 通用分页存储过程第5/5页

发布:dxy 字体:[增加 减小] 类型:转载

以下这个是我自己写的一个分页通用存储过程
该方法也就是上头所提到的行计数的方式,在系统中使用发现过很多次问题,这是最终版本应该不会再有什么算法之类的问题出现了
这个存储过程的原理就是“譬如现在要第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
当前5/5页 上一页12345
浏览次数:载入中... 打印本文关闭本文文章来源
·在百度中搜索关于“[数据库] 通用分页存储过程”相关内容
·在谷歌中搜索关于“[数据库] 通用分页存储过程”相关内容

文章评论

共有 位脚本之家网友发表了评论我来说两句

同 类 文 章
最 近 更 新
热 点 排 行