• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
我就是但丁徊 显示全部楼层 发表于 2021-10-26 12:36:09 |阅读模式 打印 上一主题 下一主题
正常情况下,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)返回总数据条数,用于客户端举行分页体现

根据以上的思绪,编写出以下通用的分页存储过程:
复制代码 代码如下:
  1. <BR>--// ============================ <BR>--// SQL Server通用分页存储过程 <BR>--// Author : netwild <BR>--// date : 2010/07/22 <BR>--// Email : netwild@163.com <BR>--// QQ : 52100641(网无忌) <BR>--// ============================ <br><br>SET QUOTED_IDENTIFIER ON <BR>GO <BR>SET ANSI_NULLS ON <BR>GO <br><br><BR>CREATE PROC execByPage <br><br>@sqlQuery varchar(2000), --//输入参数:SQL检索语句或表名 <BR>@pageSize int, --//输入参数:每页显示记录条数 <BR>@pageIndex int --//输入参数:当前页码 <br><br>AS <br><br>SET NOCOUNT ON <BR>SET ANSI_WARNINGS OFF <br><br>declare @tmpTableName varchar(50) <BR>set @tmpTableName = '##TB1516_' + replace(cast(newid() as varchar(40)),'-','') --//生成随机临时表名称 <br><br>declare @subIndex int <BR>set @subIndex = charindex('from',@sqlQuery) <BR>if (@subIndex > 0) <BR>begin --//带FROM的标准检索语句 <BR>declare @sqlQuery1 varchar(2000) <BR>declare @sqlQuery2 varchar(2000) <BR>set @sqlQuery1 = substring(@sqlQuery,1,@subIndex - 1) <BR>set @sqlQuery2 = substring(@sqlQuery,@subIndex,len(@sqlQuery)) <BR>set @sqlQuery = @sqlQuery1 + ',IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' ' + @sqlQuery2 <BR>end <BR>else --//不带FROM的表名 <BR>begin <BR>set @sqlQuery = 'select *,IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' from' + @sqlQuery <BR>end <BR>exec(@sqlQuery) --//建立并初始化临时表数据 <br><br>declare @indexStart varchar(20),@indexEnd varchar(20) <BR>set @indexStart = cast((@pageIndex-1)*@pageSize+1 as varchar(20)) --//数据起始行ID <BR>set @indexEnd = cast(@pageIndex * @pageSize as varchar(20)) --//数据结束行ID <br><br>exec('select * from ' + @tmpTableName + ' where ID1516 between ' + @indexStart + ' and ' + @indexEnd) --//检索该页数据 <br><br>exec('select max(ID1516) as recordCount from ' + @tmpTableName) --//提取总条数 <br><br>exec('drop table ' + @tmpTableName) --//删除临时表 <br><br><BR>GO <BR>SET QUOTED_IDENTIFIER OFF <BR>GO <BR>SET ANSI_NULLS ON <BR>GO <BR> <BR>
复制代码

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作