建立表:
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的游标存储过程分页) 效率最差,但是最为通用
在实际情况中,要具体分析。
SQL Server 存储过程的分页
2020-03-10 12:00ASP教程网 ASP教程
建立表: CREATETABLE[TestTable]( [ID][int]IDENTITY(1,1)NOTNULL, [FirstName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL, [LastName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL, [Country][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL, [Note][nvarchar](2000)COLLATECh
延伸 · 阅读
- 2022-03-09MySQL存储过程图文实例讲解
- 2022-03-09C# Ado.net实现读取SQLServer数据库存储过程列表及参
- 2022-03-08SpringBoot+Mybatis分页插件PageHelper实现分页效果
- 2022-03-06C#连接SQL Server的实现方法
- 2022-03-04SQL Server2012无法连接到服务器的解决方法
- 2022-03-03SQL Server查询某个字段在哪些表中存在
- ASP教程
asp 采集实战代码
最近实在是太流行采集了,本人是不喜欢采集的,但对采集的原理我却很有兴趣进行研究,拿到了网上采集常用函数,对其进行了一番研究,并实战,结果...
- ASP教程
CreateKeyWord asp实现的由给定的字符串生成关键字的代码
CreateKeyWord asp实现的由给定的字符串生成关键字的代码 ...
- ASP教程
ASP编程入门进阶(五):内置对象Response
通过对Request对象的学习,可以了解到,Request对象是服务器端用来获取客户端的信息的。 但作为服务器和客户端进行交互,是不是还缺少服务器端向客户端...
- ASP教程
使用ASP记录在线用户的数量的代码
网络的访问量是每一个做网站的网友们都非常关心的问题。如何得知有多少个人正在访问你的网站呢?如何将每天的访问量记录下来?下面就是一个解决方...
- ASP教程
asp 标记字符串中指定字符变色不区分大小写
今天遇到这种问题,单纯的使用replace函数不行,他会改变原有的字符串的大小写,在网上找到相关的代码,自己备份下...
- ASP教程
asp最简单最实用的计数器
刚才找一个计数器,由于网站的访问量太少,放个计数器在那里确实有点寒酸了,于是呼只能搞一个简单点的,可以访问一次就记录一次的来撑撑门面先。...
- ASP教程
一个改进的ASP生成SQL命令字符串类的代码[已测]
网上找资料发现的,但是调试的时候发现有一些问题,改了一下,还有一定的问题,但是可以做一般使用了。没有考虑数据类型的问题,还有SQL Server 和a...
- ASP教程
最小asp后门程序
这个代码,一般不会 被病毒查杀,而且文件比较小,不容易被怀疑,可以放到别的asp文件中,起到隐藏的目的 ...