-----------------------------------------------------------------------------------
--作者:启程 www.letwego.cn
--只是本人大概测试,不一定完全正确
DECLARE @DateBegin datetime
DECLARE @DateEnd datetime
SET @DateBegin=getdate()
--------------------此处的分页存储过程均不是通用的,通用的都要拼接Sql语句------------------
-----测试数据:Cpu:Core 1.8,内存:1G, 1百万条,取第 5000 页,每页 100条,结果时间 毫秒

--NOT IN (需要主键,需要拼接Sql,速度第二)
--EXEC spPage2000 @pageSize=100,@pageIndex=5000,@Counts=0
--测试:3080 3016 3236 3173 3186 3233 3203 3123 3216 3060 

--三次 ORDER BY (不需要主键,需要拼接Sql,速度第五)
--EXEC spPage2001 @pageSize=100,@pageIndex=5000,@Counts=0
--测试:42890 52453 48220

--临时表 (需要主键,不需要拼接Sql,速度第三)
--EXEC spPage2002 @pageSize=100,@pageIndex=5000,@Counts=0
--测试:13890 13656 14000

--游标 (不需要主键,不需要拼接Sql,最容易做成通用,速度第四)
--EXEC spPage2003 @pageSize=100,@pageIndex=5000,@Counts=0
--测试:20453 21216 21346

--SQL 2005 ROW_NUMBER(不需要主键[有主键更快],不需要拼接Sql,速度第一)
EXEC spPage2005 @pageSize=100,@pageIndex=5000,@Counts=0
--有主键测试:830 873 830 890 843 826 830 
--无主键测试:15890 14970 15703
---------------------------------------------------------------------
SET @DateEnd=getdate()
SELECT DATEDIFF(millisecond,@DateBegin,@DateEnd)

-----------------------------------------------------------------------------------
--表结构

CREATE TABLE [dbo].[UserInfo2](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [user] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [password] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [datetime] [datetime] NULL  DEFAULT (getdate()),
    [content] [ntext] COLLATE Chinese_PRC_CI_AS NULL
)

-----------------------------------------------------------------------------------
--插入数据

--SELECT COUNT(1) FROM userinfo

DECLARE @I int
SET @I=1

WHILE @I<=100 BEGIN --需要测试时间性能请修改此处

    INSERT INTO userinfo (
        [user],
        password,
        [datetime],
        [content]
    )

    VALUES (
        'user ' + CAST(@I AS nvarchar(50)),
        'password ' + CAST(@I AS nvarchar(50)),
        GETDATE(),
        '添加系统用户组添加系统用户组添加系统用户组添加系统用户组添加系统用户组添加系统用户组'
    )

    SET @I = @I + 1
END


---------------------------此处的分页存储过程均不是通用的,通用的都要拼接Sql语句----------------------------

-- Description:利用Sql2005 ROW_NUMBER,分页存储过程(不需要主键,不需要拼接Sql)
CREATE PROCEDURE [dbo].[spPage2005]
(
@pageSize int = 20,    ----每页显示的记录个数
@pageIndex int = 1,    ----要显示那一页的记录
@Counts int = 0 OUTPUT      ----查询到的记录数
)
AS
SET NOCOUNT ON

DECLARE @pageUp INT 
DECLARE @pageDown INT


--获得总记录数
SELECT @Counts = COUNT(1) FROM UserInfo

--当前页的第一条记录RowID
SET @pageDown = @pageSize * (@pageIndex - 1) + 1

--当前页的最后一条记录RowID
SET @pageUp = @pageSize * @pageIndex


--获取分页后的数据
SELECT T.* --没有主键此处不用 T.
FROM 
(
SELECT id ,--没有主键此处改用 *
   RowID = ROW_NUMBER () OVER (ORDER BY id DESC)
FROM UserInfo
) AS PageTableList
JOIN UserInfo AS T ON T.id = PageTableList.id --没有主键此句删除
WHERE RowID BETWEEN @pageDown AND @pageUp
ORDER BY T.id DESC --没有主键此句删除


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

-- Description:Sql2000,分页存储过程 NOT IN(需要主键,需要拼接Sql)
CREATE PROCEDURE dbo.spPage2000
(
    @pageSize int = 20,            ----每页显示的记录个数
    @pageIndex int = 1,            ----要显示那一页的记录
    @Counts int = 0 OUTPUT      ----查询到的记录数
)
AS
SET NOCOUNT ON

DECLARE @pageUp INT 
DECLARE @SQL nvarchar(4000) 


--获得总记录数
SELECT @Counts = COUNT(1) FROM UserInfo


SET @pageUp = @pageSize * (@pageIndex - 1)


--获取分页后的数据
SET @SQL=
'SELECT TOP ' + CAST(@pageSize AS varchar(20)) +
' * FROM UserInfo ' +
' WHERE id NOT IN '+
'('+
'SELECT TOP ' + CAST(@pageUp AS varchar(20)) + ' id ' +
' FROM UserInfo ORDER BY id DESC ' +
') ORDER BY id DESC '

EXEC(@SQL)


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

-- Description:Sql2000,分页存储过程 三次 ORDER BY(不需要主键,需要拼接Sql)
CREATE PROCEDURE dbo.spPage2001
(
    @pageSize int = 20,            ----每页显示的记录个数
    @pageIndex int = 1,            ----要显示那一页的记录
    @Counts int = 0 OUTPUT      ----查询到的记录数
)
AS
SET NOCOUNT ON

DECLARE @pageUp INT 
DECLARE @SQL nvarchar(4000) 


--获得总记录数
SELECT @Counts = COUNT(1) FROM UserInfo


SET @pageUp = @pageSize * (@pageIndex + 1)


--获取分页后的数据
SET @SQL=
('SELECT * FROM
        (SELECT TOP ' + CAST(@pageSize AS varchar(20)) + ' * FROM ' +
            '(SELECT TOP ' + CAST(@pageUp AS varchar(20)) + ' * FROM UserInfo   ORDER BY id DESC) TB2 '+
            ' ORDER BY id ASC ) TB3 '+
              ' ORDER BY id DESC  ')

EXEC(@SQL)

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

-- Description:Sql2000,分页存储过程 临时表(需要主键,不需要拼接Sql)
CREATE PROCEDURE dbo.spPage2002
(
    @pageSize int = 20,            ----每页显示的记录个数
    @pageIndex int = 1,            ----要显示那一页的记录
    @Counts int = 0 OUTPUT      ----查询到的记录数
)
AS
SET NOCOUNT ON

DECLARE @pageUp INT 
DECLARE @pageDown INT 


--获得总记录数
SELECT @Counts = COUNT(1) FROM UserInfo

--当前页的第一条记录RowID
SET @pageDown = @pageSize * (@pageIndex - 1) + 1

--当前页的最后一条记录RowID
SET @pageUp = @pageSize * @pageIndex
--定义插入临时表的总数据
SET rowcount @pageUp

--定义临时表变量
DECLARE @indextable table(indexID int identity(1,1),nid int)

--插入到临时表
INSERT INTO @indextable(nid) SELECT ID FROM UserInfo ORDER BY ID DESC
--获取分页后的数据
SELECT * FROM UserInfo p,@indextable t WHERE p.ID=t.nid
AND t.indexID>=@pageDown and t.indexID<=@pageUp ORDER BY t.indexID

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

-- Description:Sql2000,分页存储过程 游标(不需要主键,不需要拼接Sql)
--此存储过程 出来多一个空的结果集 ,暂时不明白
CREATE PROCEDURE dbo.spPage2003 
(  
    @sql nvarchar(4000) = NULL, --要执行的sql语句
    @pageSize int = 20,    ----每页显示的记录个数
    @pageIndex int = 1,    ----要显示那一页的记录
    @Counts int = 0 OUTPUT      ----查询到的记录数
)
AS
SET NOCOUNT ON

DECLARE @p1 int--P1是游标的id 

SET @sql = 'SELECT * FROM UserInfo Order By Id Desc'
EXEC sp_cursoropen @p1 OUTPUT,@sql,@scrollopt=1,@ccopt=1,@rowcount=@Counts OUTPUT

SELECT @Counts=ceiling(1.0*@Counts/@pageSize) ,@pageIndex=(@pageIndex-1)*@pageSize+1
--SELECT @pageIndex
EXEC sp_cursorfetch @p1,16,@pageIndex,@pageSize
--EXEC sp_cursorclose @p1

转载于:https://www.cnblogs.com/84ww/archive/2008/05/11/1192346.html

Sql Server 存储过程分页大全(2005,2000)相关推荐

  1. SQL SERVER 通用分页存储过程

    SQL SERVER 通用分页存储过程 从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和page ...

  2. SQL Server OFFSET 分页存储过程

    SQL Server OFFSET 分页存储过程 --参数值 SET @sqlquert=N'SELECT * FROM dbo.tbCOM_Job ORDER BY Job_ID ';--这里一定得 ...

  3. 在SQL Server中分页结果的最佳方法是什么

    如果您还希望获得结果总数(在进行分页之前),那么在SQL Server 2000.2005.2008.2012中对结果进行分页的最佳方法是(性能明智的)? #1楼 最终, Microsoft SQL ...

  4. SQL Server存储过程里全库查找引用的数据库对象(表、存储过程等)

    SQL Server存储过程全库匹配数据库对象(表.存储过程等) 简介 可以通过自定义存储过程sp_eachdb来遍历每个数据库然后结合sys.objects 关联sys.sql_modules后的d ...

  5. 浅谈SQL Server数据库分页

    数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...

  6. oracle如何调试sql,调试oracle与调试sql server存储过程

    [IT168 技术]关于存储过程的调试,知道方法以后很简单,但在不知道的时候,为了测试一个存储过程的正性,print,插入临时表等可谓是使出了浑身解数,烦不胜烦.下面就把我工作中调试oracle存储过 ...

  7. SQL Server存储过程输入参数使用表值

    在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入. 在2008中提供了表值参数.使用表值参数,可以不 ...

  8. Sql Server 数据分页

    Sql Server 数据分页 在列表查询时由于数据量非常多,一次性查出来会非常慢,就算一次查出来了,也不能一次性显示给客户端,所以要把数据进行分批查询出来,每页显示一定量的数据,这就是数据要分页. ...

  9. SQL server 存储过程的建立和调用

    SQL server 存储过程的建立和调用 存储过程的建立和调用 --1.1准备测试需要的数据库:test,数据表:物料表,采购表 if not exists (select * from maste ...

  10. java调用存储过程 sql server_Java中调用SQL Server存储过程示例

    Java中调用SQL Server存储过程示例2007-09-03 08:48来源:论坛整理作者:孟子E章责任编辑:方舟·yesky评论(3) 最近做了个Java的小项目(第一次写Java的项目哦), ...

最新文章

  1. java 启动 jetty_如何通过命令行启动或者关闭 Jetty 服务器
  2. 使用FindAncestor查找方式绑定且不需要使用datacontext
  3. android 加减乘除计算器,【03-21求助】写一个简易计算器的安卓app,一按加减乘除就退出...
  4. 覆盖网络 Flannel 0.7
  5. 黑莓证实裁员约200人 黑莓10和设备部门影响最大
  6. 深入理解了MySQL,你才能说熟悉数据库
  7. 基于YOLOv3 与CRNN的中文自然场景文字检测与识别
  8. ospf配置命令_思科设备 OSPF 的相关知识点
  9. 浏览器兼容性问题-JSDOM(转)
  10. 11.05面向对象 封装
  11. mac php开发集成环境,MAC OS X下php集成开发环境mamp
  12. 《了不起的我》读后感
  13. E430 加装固态硬盘(SSD)参考
  14. python scapy 抓包_python+scapy 抓包与解析
  15. 计算机网络:网络传输介质
  16. Windows系统的正版与盗版
  17. DRM DUMB相关说明
  18. 倾斜摄影超大场景的三维模型轻量化与三维展示效果的关系浅析
  19. 关于网站域名备案流程
  20. 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏

热门文章

  1. Tuxera NTFS对磁盘进行不同格式转换
  2. 设计模式入门-模板模式
  3. MIS系统权限控制的一个简便方法
  4. log4j容器初始化探究
  5. Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题
  6. 在ASP.NET的母版页中使用图片和超链接,HTML标记和ASP.NET标记的不同
  7. 远程登录(Telnet)的配置
  8. 如何从视频中删除声音?
  9. Kaleidoscope for Mac(文件和图像比较工具)
  10. Vectorworks 2022 SP2 for mac(首选3D建筑设计软件)