博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 存储过程的分页
阅读量:7157 次
发布时间:2019-06-29

本文共 2015 字,大约阅读时间需要 6 分钟。

导读: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 procedure 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://asegl.baihongyu.com/

你可能感兴趣的文章
MySQL命令3
查看>>
Money-去哪了每日站立会议
查看>>
数据插入不覆盖更新,设置定时任务
查看>>
百度 实验三
查看>>
《Android源码设计模式》学习笔记之ImageLoader
查看>>
图标字体运用以及其优势与劣势
查看>>
背完这444句英语,你的英语口语不成问题了
查看>>
POJ 1700 过河坐船最短时间问题
查看>>
微信支付v2开发(9) 标记客户投诉处理状态
查看>>
最小生成树-Prim算法
查看>>
协议的构成
查看>>
HDU 4251 The Famous ICPC Team Again(划分树)
查看>>
取数游戏
查看>>
团队项目用户验收评审
查看>>
Xcode 升级后,常常遇到的遇到的警告、错误,解决方法(转)
查看>>
libguestfs实现原理summary
查看>>
双活存储基础知识
查看>>
[python] 线程池
查看>>
《php和mysql web开发》读书笔记
查看>>
Scrapy安装
查看>>