下面小编为大家整理了实现千万级数据的分页显示数据库教程(共含4篇),欢迎阅读与借鉴!同时,但愿您也能像本文投稿人“allenchuan”一样,积极向本站投稿分享好文章。
分页|数据|显示
这是经我该写后的存储过程
---------------------------------------------------------
ALTER PROCEDURE usp_GetRecordFromPage
@tblName varchar(1000), -- 表名
@SelectFieldName varchar(4000), -- 要显示的字段名(不要加select)
@strWhere varchar(4000), -- 查询条件(注意: 不要加 where)
@OrderFieldName varchar(255), -- 排序索引字段名
@PageSize int , -- 页大小
@PageIndex int = 1, -- 页码
@iRowCount int output, -- 返回记录总数
@OrderType bit = 0 -- 设置排序类型, 非 0 值则降序
AS
declare @strSQL varchar(4000) -- 主语句
declare @strTmp varchar(4000) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
declare @strRowCount nvarchar(4000) -- 用于查询记录总数的语句
set @OrderFieldName=ltrim(rtrim(@OrderFieldName))
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @OrderFieldName +' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @OrderFieldName +' asc'
end
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + @strTmp + ' ' + @strOrder
end
exec(@strSQL)
if @strWhere!=''
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere
end
else
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName
end
exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out
现在一般用的比较多的数据库,应该是Oracle,MSSQL(T sql),mysql,但是他们并没有统一的标准来实现分页查询,也就是没有统一的SQL标准,所以他们三个方法各不同给编码人员造成了很大的不便,先总结一下,与大家共享!
Mysql 是最简单的,就是使用Limit进行查询。例如:select * from tmp_table limit 10,20;也就是从tmp_table表中查找(10,20)之间的元组。Oracle 也基本上实现了这种方法,但是形式却有所不同。例如:select * from tmp_table where rownum>=10 and rownum<=20;也就是从tmp_table表中查找(10,20)之间的元组。MSSQL(T SQL)只有TOP,也就是取出一个表中的头部的N条元组,但是没有直接可以取出N到M之间的数据的方法,所以这里要自己开发。例如上面是实现了每页10个数据,然后取出(10,20)之间的数据(也就是第二页),MSSQL这么实现:select * from(
select top 10 * from
(
select top 20 * from tmp_table order by id
) order by id
DESC)order by id ASC;其实这里原理应该是比较简单的,因为我们要取出(10,20)之间的元组,先取出前20条,然后降序取出前10条,然后升序取出全部的,也就实现了升序取出(10,20)元组了,显然,这也是因为SQL的标准并不是很严格的缘故吧,所以很多的数据库的实现方式都不同,但是经过我们对SQL标准的学习,我们应该是可以总结出相同的方法的。
复制代码代码如下:
--*******************************************************
--* 分页存储过程 *
--* 撒哈拉大森林 *
--* -6-28 *
--*******************************************************
if exists(select * from sysobjects where type='P' and name=N'P_Paging')
drop procedure P_Paging
go
create procedure P_Paging
@SqlStr nvarchar(4000), --查询字符串
@CurrentPage int, --第N页
@PageSize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@SqlStr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@PageSize) as 总页数--,@rowcount as 总行数,@CurrentPage as 当前页
set @CurrentPage=(@CurrentPage-1)*@PageSize+1
exec sp_cursorfetch @P1,16,@CurrentPage,@PageSize
exec sp_cursorclose @P1
set nocount off
go
----创建测试表
--if exists(select * from sysobjects where type='U' and name=N'Test_Students')
-- drop table Test_Students
--go
--create table Test_Students(
-- id int IDENTITY(1,1) not null,
-- name nvarchar(100) not null
--)
--
----创建测试数据
--declare @i int
--set @i = 100000
--while @i>0
-- begin
-- insert into Test_Students values('姓名')
-- set @i = @i - 1
-- end
--
----执行存储过程
--exec P_Paging 'select * from Test_Students order by id',100,100 --执行
--
----删除测试表
--if exists(select * from sysobjects where type='U' and name=N'Test_Students')
-- drop table Test_Students
--go
以下为引用的内容:
<%
'-------------------------数据库连接-----------------------
Set bjConn = Server.CreateObject(“ADODB.Connection”)
objConn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;” &_
“Data Source=” & Server.MapPath(“data.mdb”)
objConn.Open
'-------------------------数据库连接-----------------------
'-------------------------检索数据-----------------------
strSQL = “SELECT id,DataColumn FROM DataTable”
'Sql语句,检索数据库
Set bjRS = Server.CreateObject(“ADODB.Recordset”)
'创建记录集
objRS.Open strSQL, objConn, 1, 1
'执行检索
Count=objRS.RecordCount
'得到记录总数
Item=4
'显示记录数
'-------------------------检索数据-----------------------
'-------------------------------------------------------------------------------
redim a(Item, 2),t(Count)
'定义2数组,数组a用来储存记录,数组t用来删选记录
'---------------------------------------
'初始数组数值,目的为了插入数据以后和此值做比较
for each j in t
j=0
next
'---------------------------------------
'---------------------------------------
' 随机抽取记录号
Randomize timer '初始化随机数生成器
for j=1 to Item
k=int(rnd*Count+1) '从总数里面随机取一条记录
do while t(k)0 '判断是否记录是否已经在数组中
k=int(rnd*Item+1)
loop
t(k)=1 '第k条记录被选中
next
'--------------------------------------
j=1:i=1'定义下标
'--------------------------------------
' 循环选取数据集objRS中的部分记录存放到数组中
Do While Not objRS.Eof
if t(j)=1 then
a(i,1)=objRS(“id”) '记录id
a(i,2)=objRS(“DataColumn”) '记录内容
i=i+1
end if
j=j+1
objRS.MoveNext
Loop
'--------------------------------------
'-------------------------------------------------------------------------------
'----------------------------显示内容--------------------
for i=1 to Item
Response.write “序号”&a(i,1)&“
”
Response.write “内容”&a(i,2)&“
”
next
'----------------------------显示内容--------------------
'---------------------------
'释放资源
objRs.Close
set bjRs=nothing
objConn.Close
set bjConn=nothing
'---------------------------
%>