当前位置:首页 » 存储配置 » 存储过程翻页

存储过程翻页

发布时间: 2022-07-14 02:21:04

A. sql存储过程分页 临时表问题

sql分页不一定用存储过程,就过个人认为存储过程尽量少用!
--前提是必需有一列是自动增长类型,唯一性

--方法一

SELECT DISTINCT TOP 8 CategoryID
FROM tbl_Proct_Procts
WHERE (UserID = 73) AND (CategoryID >
(SELECT MAX(categoryid)
FROM (SELECT DISTINCT TOP 16 categoryid
FROM tbl_proct_procts where userid=73
ORDER BY categoryid) AS b))
ORDER BY CategoryID

--方法二

select top 10 * from [order details]
where orderid>all(select top 10 orderid from [order details] order by orderid)
order by orderid
下面的来自CSDN-------------------------------------
SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
建立表:

CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON

declare @i int
set @i=1
while @i<=20000
begin
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
set @i=@i+1
end

SET IDENTITY_INSERT TestTable OFF

-------------------------------------

分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID

-------------------------------------

分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID

-------------------------------------

分页方案三:(利用SQL的游标存储过程分页)
create procere XiaoZhengGe
@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

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

在实际情况中,要具体分析。

更多的讨论见:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515

B. 用存储过程怎么写分页

create proc 电影存储过程 --翻页存储过程
@PageSize int, --每页面显示数据条数
@PageIndex int, --页面索引
@PageCount int output, --总页数
@名称 nvarchar(100)
as
--查询范围 (@PageSize*@PageIndex+1) 起始行
-- @PageSize*(@PageIndex+1) 结束行

select * from(select Row_Number() over (order by 影片ID) as id, * from(
select * from 电影 where 名称 like '%'+@名称+'%' or 主演 like '%'+@名称+'%' )a )b where id between (@PageSize*@PageIndex+1) and @PageSize*(@PageIndex+1)

--得到数据行数
select @PageCount=count(1) from 电影 where 名称 like '%'+@名称+'%' or 主演 like '%'+@名称+'%'
--计算出总行数
set @PageCount= (@PageCount-1)/@PageSize+1
print @PageCount

C. 存储过程的翻页原理

编写一个带有输入参数的存储过程,参数为要显示的数据的页数,和要显示的数据的行数,根据这个参数来检索想要显示的内容。
比如:
create proc GetData
@pagenum int,
@linenum int
as
select * from tablename
where rownum > ((@pagenum-1) * @linenum)
and rownum <= (@pagenum * @linenum)

exec GetData @pagenum = 1,@linenum = 50

不知道这个答案是不是你要的?

D. 求Mysql数据库的翻页存储过程例子

这样,我给你个私信,你看看,望采纳哦

E. 怎样用php+mysql存储过程,并在php页面里显示首页 第一页 下一页 末页

class TViewPage
{
var $Table; //表名
var $MaxLine=15; //每页显示行数
var $Offset; //记录偏移量
var $Total; //记录总数
var $Number; //本页读取的记录数
var $Result; //读出的结果
var $TPages; //总页数
var $CPages; //当前页数
var $Condition; //数据库搜索条件
var $PageQuery; //分页显示要传递的参数

var $strPageFrist = '首页'; //设置导航条翻页提示符
var $strPagePrev = '上页';
var $strPageNext = '下页';
var $strPageLast = '末页';

var $strDispPageFrist; //设置导航条翻页(未激活状态)提示符
var $strDispPagePrev; //如果不设置,导航条将不区别显示激活与否
var $strDispPageNext; //本项配合图形可获得最佳效果
var $strDispPageLast;

//******构造函数*************
//参数:表名、最大行数、偏移量
function TViewPage($TB,$ML,$OF)
{
$this->Table = $TB;
$this->MaxLine = $ML;
$this->Offset = (floor($OF/$ML)) * $ML;
}

//********设置显示条件*********
//如:where id="$id" order by id desc
//要求是字串,符合SQL语法(本字串将加在SQL语句后)
function setCondition($s)
{
$this->Condition=$s;
}

//******设置传递参数************
// key参数名 value参数值
// 如:setpagequery("id",$id);如有多个参数要传递,可多次调用本函数
function setPageQuery($key,$value)
{
$tmp[key]=$key;$tmp[value]=$value;
$this->PageQuery[]=$tmp;
}

//********设置导航条分页显示的字符或图形*********
//如:首页 或 <IMG SRC=frist.gif ALIGN=absmiddle> 等。
//要求是字串,符合HTML语法显示的要求
//如果不设置,导航条使用默认字符
function setPageFrist($s,$sd="")
{
$this->strPageFrist=$s;
$this->strDispPageFrist=$sd;
}
function setPagePrev($s,$sd="")
{
$this->strPagePrev=$s;
$this->strDispPagePrev=$sd;
}
function setPageNext($s,$sd="")
{
$this->strPageNext=$s;
$this->strDispPageNext=$sd;
}
function setPageLast($s,$sd="")
{
$this->strPageLast=$s;
$this->strDispPageNext=$sd;
}

//********读取记录***************
// 主要工作函数,根据所给的条件从表中读取相应的记录
// 返回值是一个二维数组,Result[记录号][字段名]
function getRecords()
{
$SQL="SELECT Count(*) AS total FROM ".$this->Table." ".$this->Condition;
$result=mysql_query($SQL) or die(mysql_error());
$row=mysql_fetch_Array($result);
........

+QQ 43054660 我可以帮你。。

F. (问题解决再追加100分)sql server存储过程实现查询数据条数过大,分页查询怎么实现

按说5-8w这样数量级的数据没有问题,写入Excel是布比较耗性能,主要还是要通过优化写入Excel的代码效率上去考虑。你可以考虑利用分批查询写入的方式来避免一次写太多的数据到Excel:将你的查询结果分段,比方你的语句中能不能用时间来认为分段,每次返回部分结果。
回到你的问题,对大数据量查询的解决方案有以下两种:
(1)、将全部数据先查询到内存中,然后在内存中进行分页,这种方式对内存占用较大,必须限制一次查询的数据量。
(2)、采用存储过程在数据库中进行分页,这种方式对数据库的依赖较大,不同的数据库实现机制不通,并且查询效率不够理想。以上两种方式对用户来说都不够友好。

2.解决思路
通过在待查询的数据库表上增加一个用于查询的自增长字段,然后采用该字段进行分页查询,可以很好地解决这个问题。下面举例说明这种分页查询方案。

(1)、在待查询的表格上增加一个long型的自增长列,取名为“queryId”,mssql、sybase直接支持自增长字段,oracle可以用sequence和trigger来实现。然后在该列上加上一个索引。
添加queryId列的语句如下:
Mssql: [QUERYID] [bigint] IDENTITY (1, 1)

Sybase: QUERYID numeric(19) identity

Oracle:
CREATE SEQUENCE queryId_S
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999 MINVALUE 1
CYCLE
CACHE 20
ORDER;
CREATE OR REPLACE TRIGGER queryId_T BEFORE INSERT
ON "test_table"
FOR EACH ROW
BEGIN
select queryId_S.nextval into :new.queryId from al;
END;

(2)、在查询第一页时,先按照大小顺序的倒序查出所有的queryId,
语句如下:select queryId from test_table where + 查询条件 +order by queryId desc 。
因为只是查询queryId字段,即使表格中的数据量很大,该查询也会很快得到结果。然后将得到的queryId保存在应用服务器的一个数组中。

(3)、用户在客户端进行翻页操作时,客户端将待查询的页号作为参数传递给应用服务器,服务器通过页号和queyId数组算出待查询的queyId最大和最小值,然后进行查询。

算出queyId最大和最小值的算法如下,其中page为待查询的页号,pageSize为每页的大小,queryIds为第二步生成的queryId数组:
int startRow = (page - 1) * pageSize
int endRow = page * pageSize - 1;
if (endRow >=queryIds.length)
{
endRow = this.queryIds.length - 1;
}
long startId =queryIds[startRow];
long endId =queryIds[endRow];

查询语句如下:
String sql = "select * from test_table" + 查询条件 + "(queryId <= " + startId + " and queryId >= " + endId + ")";

3.效果评价
该分页查询方法对所有数据库都适用,对应用服务器、数据库服务器、查询客户端的cpu和内存占用都较低,查询速度较快,是一个较为理想的分页查询实现方案。经过测试,查询4百万条数据,可以在3分钟内显示出首页数据,以后每一次翻页操作基本在2秒以内。内存和cpu占用无明显增长。

以上也仅仅是分页查询结果查看的问题,你需要写入到Excel的话还需要考虑Excel写入代码的执行效率,这部分是很值得研究的。

G. 存储过程分页越往后越慢

在SQL2005里面有一个专门支持分页的函数,你使用一下呢.

select * from (select row_number()over(order by 排序的字段)
as 自动序列,* from 表名) aa
where 自动序列>=2000000 and 自动序列 <2000100

我在5000万的表中查询,19S

H. 用存储过程分页后,前台上一页,跳转页怎么写

页面中用一个lable记录当前存储过程所使用的页数,点击 上一页的时候lable的值-1,下一页的时候lable的值+1,同时给存储过程传递lable的值作为分页存储过程的一个参数(页数),然后调用绑定数据函数.
页面初始化的时候可以初始化lable的值为1,然后子(!ispostback)中调用绑定函数.
不知道清除否??

I. 表单post提交查询数据库调用存储过程实现分页功能

首先要知道分页显示数据需要哪些参数,包括总共有多少条数据的参数dataCount,每页显示多少条数据的参数pageSize,总共有多少页数的参数pageCount,当前页数(页码)的参数pageIndex。

获取总共多少条数据的参数dataCount非常简单,执行Sql语句“select count(*) from test”就可以拿到dataCount值了,还有一个非常简单的参数就是当前页数(页码)pageIndex默认就是1。
每页显示多少条数据根据网页显示量来设定,假设网页一页显示10,那么pageSize就是10,有dataCount和pageSize值,总共有多少页数也就可以获得了,pageCount=dataCount/pageSize,通过这样计算页数方式获得的数据量一定小于实际的页数,这里就需要用到取顶函数pageCount=1.0*dataCount/pageSize。

关键就是如何通过准备的参数获取数据,还需要用到Sql Server2005及以上版本的数据库才有的给数据库表数据查询时增加序号的函数,这是因为我们存放在数据库的数据没有连续自动增长的编号,借助函数row_number()可以通过按某个字段排序设定序号,方便获取数据准确。
比较两条Sql语句“select * from test”和“select *,row_number() over(order by Test1) as '序号' from Test”查询数据进行比较就会发现在查询结果中会增加一个通过字段Test1排序而产生的一个序号,并且这个序号是连续自动增长的。

接下来创建存储过程,指定参数就可以了。
create proc P_Test--创建存储过程P_Test
@pageSize int,--每页数据条数
@pageIndex int,--当前页数(页码)
@pageCount int output--总的页数,因为需要显示页数,因此是个输出参数
as
declare @datacount int--总数据条数
select @datacount=count(*) from test--获得总数据条数值并赋给参数
set @pageCount=ceiling(1.0*@datacount/@pageSize)--获得总页数,并赋给参数
--接下来是获得指定页数据
select * from
(select *,row_number() over(order by Test1) as num from test) as temp
where num between @pageSize*(@pageIndex-1)+1 and @pageSize*@pageIndex

J. 如何写分页存储过程

create proc 电影存储过程 --翻页存储过程
@PageSize int, --每页面显示数据条数
@PageIndex int, --页面索引
@PageCount int output, --总页数
@名称 nvarchar(100)
as
--查询范围 (@PageSize*@PageIndex+1) 起始行
-- @PageSize*(@PageIndex+1) 结束行

select * from(select Row_Number() over (order by 影片ID) as id, * from(
select * from 电影 where 名称 like '%'+@名称+'%' or 主演 like '%'+@名称+'%' )a )b where id between (@PageSize*@PageIndex+1) and @PageSize*(@PageIndex+1)

--得到数据行数
select @PageCount=count(1) from 电影 where 名称 like '%'+@名称+'%' or 主演 like '%'+@名称+'%'
--计算出总行数
set @PageCount= (@PageCount-1)/@PageSize+1
print @PageCount

这个是我写过的分页存储过程 给你参考下啊!

热点内容
db2数据库别名 发布:2024-10-08 08:19:02 浏览:239
如何更换安卓系统时钟 发布:2024-10-08 08:12:54 浏览:396
电脑创建服务器软件 发布:2024-10-08 08:12:47 浏览:476
如何防微信恶意找回密码 发布:2024-10-08 08:01:58 浏览:813
aspnet存储过程分页 发布:2024-10-08 08:01:47 浏览:460
王者安卓怎么拍高清视频教程 发布:2024-10-08 07:57:04 浏览:263
酒吧灯光编程 发布:2024-10-08 07:52:42 浏览:8
别克英朗买15哪个配置好 发布:2024-10-08 07:43:38 浏览:237
android安装sdk 发布:2024-10-08 07:42:41 浏览:329
qq空间音乐缓存 发布:2024-10-08 07:05:49 浏览:738