几种分页存储过程

过程一:

select top N条记录 * from 文章表 where id not in(select top M条记录 id from 文章表 order by id desc ) order by id desc

过程二:

select top N条记录 * from 文章表 where id <(select min(id) from (select top M条记录 id from 文章表 order by id desc ) as tblTmp) order by id desc

--简单通用

CREATE PROCEDURE [dbo].[PageView]

@select VARCHAR(max),

@CurrentPage INT,

@PageSize INT

AS

BEGIN

declare @sql NVARCHAR(max)

DECLARE @RecordCurrent INT

DECLARE @PageCount INT

DECLARE @RecordCount INT

SET NOCOUNT ON

set @sql=‘select @RecordCount=count(*) from (‘[email protected]+‘) a‘

exec sp_executesql @sql,N‘@RecordCount int output‘,@RecordCount output

SET @PageCount=(@[email protected])/@PageSize

IF ISNULL(@CurrentPage,0)<1

SET @CurrentPage=1

ELSE if ISNULL(@CurrentPage,0)>@PageCount

SET @[email protected]

SELECT @CurrentPage AS CurrentPage,@RecordCount AS RecordCount,@PageSize AS PageSize,@PageCount AS PageCount

set @sql=‘select * from (‘[email protected]+‘) a where rownumber between ‘+cast((@CurrentPage-1)*@PageSize+1 as varchar)+‘ and ‘+cast(@CurrentPage*@PageSize as varchar)

exec (@sql)

END

--使用not in 方式的存储过程

create PROCEDURE GetPageDataByNotIn

@PageIndex int,/**//*当前页数*/

@PageSize int/**//*每页大小*/

AS

declare @starttime datetime

set @starttime=getdate()

IF @PageIndex > 0

BEGIN

set nocount on;

DECLARE @PageLowerBound int

DECLARE @StartID int

DECLARE @sql varchar(225)

SET @PageLowerBound = @PageSize * (@PageIndex-1)

IF @PageLowerBound<1

SET @PageLowerBound=1

print @PageLowerBound

select top (@PageSize) * from table where [ar_id] not in (select top ((@PageSize)*(@PageIndex-1)) ar_id from table )

EXEC(@sql)

set nocount off;

END

print ‘耗时=‘+convert(varchar(30),datediff(ms,@starttime,getdate()))

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

--使用ROWCOUNT的分页存储过程

create PROCEDURE GetPageData

@PageIndex int,/**//*当前页数*/

@PageSize int/**//*每页大小*/

AS

declare @starttime datetime

set @starttime=getdate()

IF @PageIndex > 0

BEGIN

set nocount on;

DECLARE @PageLowerBound int

DECLARE @StartID int

DECLARE @sql varchar(225)

SET @BeginIndex = @PageSize * (@PageIndex-1)

IF @BeginIndex<1

SET @BeginIndex=1

SET ROWCOUNT @BeginIndex

SELECT @StartID = [ar_id] FROM table ORDER BY ar_id

print @StartID

SET ROWCOUNT 0

SET @sql=‘select top ‘+str(@PageSize) +‘ * from table where [ar_id]>=‘+ str(@StartID) +‘ ORDER BY [ar_id] ‘

EXEC(@sql)

set nocount off;

END

print ‘耗时=‘+convert(varchar(30),datediff(ms,@starttime,getdate()))

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

测试查询一张有100W条数据的表table,每页显示10条数据

存储过程                        第1页   第10页   第100页   第1000页   第5000页

GetPageDataByNotIn    0           0            126           13530       等了2分多钟没耐性了....

GetPageData                0           0            0               16              76

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

最后使用的存储过程(推荐):

create PROCEDURE GetPageData

(

@TableName varchar(30),--表名称

@IDName varchar(20),--表主键名称

@PageIndex int,--当前页数

@PageSize int--每页大小

)

AS

IF @PageIndex > 0

BEGIN

set nocount on

DECLARE @PageLowerBound int,@StartID int,@sql nvarchar(225)

SET @PageLowerBound = @PageSize * (@PageIndex-1)

IF @PageLowerBound<1

SET @PageLowerBound=1

SET ROWCOUNT @PageLowerBound

SET @sql=N‘SELECT @StartID = [‘[email protected]+‘] FROM ‘[email protected]+‘ ORDER BY ‘[email protected]

exec sp_executesql @sql,N‘@StartID int output‘,@StartID output

SET ROWCOUNT 0

SET @sql=‘select top ‘+str(@PageSize) +‘ * from ‘[email protected]+‘ where [‘[email protected]+‘]>=‘+ str(@StartID) +‘ ORDER BY [‘[email protected]+‘] ‘

EXEC(@sql)

set nocount off

END

时间: 2025-01-07 00:40:49

几种分页存储过程的相关文章

[转]关于SQL分页存储过程的分析

[转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合

关于SQL分页存储过程的分析

建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存 中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的 不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长

sql笔记/分页存储过程

[email protected]c#中进行++操作可以是整数或小数,sql中只能对整数进行++操作.char类型 适合存储长度波动较小不回收效率高varchar 类型 适合存储长度波动较大可以回收nchar代表unicode 存储内容包括汉字时候考虑加n SQL语句特点1不区分大小写2没有双引号所有字符串都包含在单引号3没有逻辑相等,逻辑相等和赋值一样都是用=4没有bool值得概念,但是在视图中可以输入true/false5也有关系运算符.6也有逻辑运算符 &&-- and || --o

Oracle实践--PL/SQL综合之分页存储过程

当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说StringBuilder中,有这么一句,"将StringBuilder 的实例用于多个线程是不安全的.如果需要这样的同步,则建议使用StringBuffer. ",那么下面手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果. Count.java: [java] view plaincopy public class Count { private int num; public 

SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

  第一种:单表多字段排序分页存储过程       --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( @TableName varchar(50), --表名 @ReFieldsStr varchar(200) = '*', --字段名(全部字段为*) @OrderString varchar(200), --排序字段(必须!支持多字段不用加order by) @WhereString varchar(500)

大数据量分页存储过程效率测试附代码

在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话. 测试环境 硬件:CPU 酷睿双核T5750  内存:2G 软件:Windows server 2003    +   Sql server 2005 OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 按 Ctrl+C 复制代码1create database data_Test --创建数据库data_Test 2GO 3use data

大数据量分页存储过程效率测试附代码(转http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html)

在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话. 测试环境 硬件:CPU 酷睿双核T5750  内存:2G 软件:Windows server 2003    +   Sql server 2005 OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 1create database data_Test  --创建数据库data_Test  2GO  3use data_Test  4GO

sql 可按任意字段排序的分页存储过程

最近做一个项目,其中有许多部分需要用到分页功能 并且这些需要分页的地方有一个共同的特点,那就是,分页,但并不是按ID(主键)来排序,而是要求按其他有重复值的列进行排序,比如,其中有一个页面,要列出将近1万条客户记录,要求按客户付费金额进行排序,这种情况,如果使用网上流行的通用分页存储过程是行不能的,比如,像下面的分页存储过程虽然很棒,可是,用在这里的话,就无计可施:(这个存储过程是我在CSDN上看到一位前辈高人写的) CREATE PROCEDURE GetRecordFromPage @tbl

【老码农怀旧】一个简单好用的分页存储过程

数据库存储过程是一组预先创建并用指定的名称存储在数据库服务器上的 SQL 语句,将使用比较频繁或者比较复杂的操作,预先用 SQL 语句写好并用一个指定的名称存储起来,以后当需要数据库提供与已定义好的存储过程的功能相同的服务时,只需再次执行该存储过程. 数据库存储过程的优点: (1)存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度. (2)通常,复杂的业务逻辑需要多条 SQL 语句.这些语句要分别