SQLServer用存储过程实现分页

原创 2007年09月21日 08:32:00

        实现数据分页查询的方案相当多,前台和后台都有很多好方法,这些好方法都有一个共同的特点:在实现分页的同时,考虑了网络资源的占有问题。本文要讨论的是使用SQL Server存储过程的实现方法。

 引子


在含有ID主键(且ID连续)的Tab表中,查找第51行到第100行数据,对应的SQL语句为:

SLECET*FROME tab WHERE ID BETWEEN 51 AND 100

如果ID不连续,或者主键为其他,则可以用下SQL语句实现同样的功能:

SELECT TOP 50 * FROM tab WHERE ID NOT IN (SELECT TOP 50 ID FROM tab)

或是

SELECT TOP 50 * FROM tab WHERE ID>@lastpage_endidi

如果用变量参数控制输入行,则使用以下语句:

SET ROWCOUNT@pagesize

SELECT * FROM tab WHERE ID>@lastpage_endid

 问题

对于没有主键的表,可能存在大量重复的记录,很多SQL Server使用者喜欢用下面的语句:

SELECT IDENTITY(INT,1,1AS ID,* INTO #T FROM tab

SELECT * FROM #T WHERE ID BETWEEN 51 AND 100

上面的方法非常笨拙,而且相当耗资源。

 分析

对于这种没有主键的表,要实现分页查询,笔者认为最好的方法是加一个IDENTITY属性的主键,然后使用文本开头使用的两种方法,效率要高得多。在原表中加入IDENTITY属性的语句如下:

ALTER TABLE tab ADD ID INT  IDENTITY PRIMARY KEY

并不是所有用户都有修改表的权限,下面介绍一种通用的方法:使用SQL Server 提供的储存过程sp_cursoropen。具体用法如下:

exec sp_cursoropen @P1 output,@sqlstr

exec sp_cursorfetch @P1,16,@begincol,@pagesize

exec sp_cursorclose @P1

其中第一句的@P1为生成的游标ID,@sqlstr为定义游标的SLELECT字符串;第二句中@begincol为起始行数,@pagesize为输出行数;第三句sp_cursorclose意即关闭游标。

 解决


以下是笔者编写的储存过程,通过传入表名,分页取出第N页数据。

Create proc getpage

(
@tablename varchar (255), @page count int=1,@pagesize int=99999999)--@tablename为表名

as

begin

set nocount on

declare @P1 int

declare @sqlstr nvarchar(400)

set @pagecount =(@pagecount-1)*@pagecount+1

set @sqlstr=select * from ’+@tablename

exec sp_cursoropen @P1 output,@sqlstr

exec sp_cursorfetch @P1,16,@pagecount,@pagesize

exec sp_cursorclose @P1

end

调用方法

exec getpage’tab’,10,100

--表名tab ,第10页,每页100行。

 

 进阶


以上存储过程比较通用,不过如果适当修改一下,把@sqlstr当作转入参数,就更灵活了,实现方法如下:

Create proc getpage

(
@sqlstr nvarchar (4000),@pagecont int=1,@pagesize int=99999999)

as

begin

set nocount on

declare @P1 int

set @pagecount =(@pagecount-1)*@pagecount+1

exec sp_cursoropen @P1 output,@sqlstr

exec sp_cursorfetch @P1,16,@pagecount,@pagesize

exec sp_cursorclose @P1

end

 

调用方法:

exec getpage’SELECT * FROM tab WHERE条件 ’,10,100

 

SQL Server 存储过程的分页方案比拼

SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点建立表:CREATE TABLE [TestTable] ( [ID] [int] IDENTI...
  • lihonggen0
  • lihonggen0
  • 2004年09月14日 01:05
  • 49523

真正高效的SQLServer中数据分页的通用存储过程

 /**//*=======================================================================  功能: 对传进来的查询SQL进行分页后返...
  • bloglife
  • bloglife
  • 2008年02月15日 22:20
  • 2071

分页-存储过程5种写法 sqlserver分页

分页-存储过程5种写法 sqlserver分页
  • u012726702
  • u012726702
  • 2016年07月03日 12:40
  • 537

SQLServer用存储过程实现分页

        实现数据分页查询的方案相当多,前台和后台都有很多好方法,这些好方法都有一个共同的特点:在实现分页的同时,考虑了网络资源的占有问题。本文要讨论的是使用SQL Server存储过程的实现方...
  • minisunny
  • minisunny
  • 2007年09月21日 08:32
  • 1510

分页存储过程,sqlserver

  • 2008年04月16日 15:37
  • 44KB
  • 下载

利用SqlServer内部存储过程实现快速方便的分页

create procedure up_zbh_DivPageBySql @strSql varchar(8000), @nPageSize int, @nPageCount intas    SET...
  • jojozhuang
  • jojozhuang
  • 2007年03月06日 10:32
  • 469

sql server 带输入输出参数的分页存储过程(效率最高)

create procedure proc_page_withtopmax ( @pageIndex int,--页索引 @pageSize int,--每页显示数 @pageCount in...
  • kingmax54212008
  • kingmax54212008
  • 2015年07月14日 11:34
  • 5753

sql server 通用分页存储过程

  • 2017年08月17日 14:10
  • 3KB
  • 下载

sql server百万数据分页存储过程

百万数据存储过程主体 创建存储过程 CREATE PROC [dbo].[Common_PageList] ( @tab nvarchar(max),---表名 @strFld nvarchar(m...
  • qq_28018731
  • qq_28018731
  • 2016年10月28日 15:45
  • 177

SQLServer千万数量级分页公共存储过程

转自:http://blog.csdn.net/tem168/article/details/6427123 SQLServer千万数量级分页公共存储过程   通用的数据库分页存...
  • chelen_jak
  • chelen_jak
  • 2014年12月11日 21:24
  • 3205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQLServer用存储过程实现分页
举报原因:
原因补充:

(最多只允许输入30个字)