SQL Server的通用分页存储过程 未使用游标,速度更快!

2022-05-24 0 394

正常情况下,SQL Server服务器上会对使用频率大的Table建立合适的索引
这样能大幅度的提高数据库本身的数据检索速度,建立索引的方法就不细说了

如果需要返回大量数据,从几百行到几万行,甚至几十万行数据
这时会发现响应速度越来越慢,甚至发生响应超时的错误
为了解决这种大数据量请求的问题,就不得不使用分页模式了

在这方面,JDBC就强悍得多,它可以将指定的行数和SQL请求一并发送给SQL Server,这样只返回分页后的数据,JDBC的原理还不清楚,但在实际使用中,速度还是非常快的

如果没办法使用JDBC,最常用的方法就是存储过程了!

我在写这个分页存储之前,参考了网上的大量相关文章,可以通过关键字:SQL Server 分页 进行搜索
他们主要都是利用SQL中的Top方法,并且对所检索的数据结构要求有标识列,如果没有标识列,或者是联合主键,那么就会非常麻烦了。而且对应用里原有的SQL检索部分需要修改的地方较多,工作量较大。

因此,我在写这个存储之前就要求一定要对原有的SQL脚本最大程度的兼容

经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路:

1、确定存储的输入参数:
1)SQL脚本,该参数接收完整的、正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入
2)每页的数据容量,就是一页有多少条数据
3)当前页码
2、确定分页机制:
1)执行传入的SQL脚本,并将结果生成临时表
2)修改临时表的结构,增加标识列字段
3)根据标识列字段,计算出指定页码内的记录范围,并返回
4)返回总数据条数,用于客户端进行分页显示

根据以上的思路,编写出以下通用的分页存储过程:

复制代码 代码如下:

[code]

–// ============================

–// SQL Server通用分页存储过程

–// Author : netwild

–// date : 2010/07/22

–// Email : netwild@163.com

–// QQ : 52100641(网无忌)

–// ============================

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO

CREATE PROC execByPage

@sqlQuery varchar(2000), –//输入参数:SQL检索语句或表名

@pageSize int, –//输入参数:每页显示记录条数

@pageIndex int –//输入参数:当前页码

AS

SET NOCOUNT ON

SET ANSI_WARNINGS OFF

declare @tmpTableName varchar(50)

set @tmpTableName = ‘##TB1516_’ + replace(cast(newid() as varchar(40)),’-‘,”) –//生成随机临时表名称

declare @subIndex int

set @subIndex = charindex(‘from’,@sqlQuery)

if (@subIndex > 0)

begin –//带FROM的标准检索语句

declare @sqlQuery1 varchar(2000)

declare @sqlQuery2 varchar(2000)

set @sqlQuery1 = substring(@sqlQuery,1,@subIndex – 1)

set @sqlQuery2 = substring(@sqlQuery,@subIndex,len(@sqlQuery))

set @sqlQuery = @sqlQuery1 + ‘,IDENTITY(numeric,1,1) as ID1516 into ‘ + @tmpTableName + ‘ ‘ + @sqlQuery2

end

else –//不带FROM的表名

begin

set @sqlQuery = ‘select *,IDENTITY(numeric,1,1) as ID1516 into ‘ + @tmpTableName + ‘ from’ + @sqlQuery

end

exec(@sqlQuery) –//建立并初始化临时表数据

declare @indexStart varchar(20),@indexEnd varchar(20)

set @indexStart = cast((@pageIndex-1)*@pageSize+1 as varchar(20)) –//数据起始行ID

set @indexEnd = cast(@pageIndex * @pageSize as varchar(20)) –//数据结束行ID

exec(‘select * from ‘ + @tmpTableName + ‘ where ID1516 between ‘ + @indexStart + ‘ and ‘ + @indexEnd) –//检索该页数据

exec(‘select max(ID1516) as recordCount from ‘ + @tmpTableName) –//提取总条数

exec(‘drop table ‘ + @tmpTableName) –//删除临时表

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

[/code]

免责声明:
1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

NICE源码网 MsSql SQL Server的通用分页存储过程 未使用游标,速度更快! https://www.niceym.com/60179.html