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

常规景况下,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 : 二〇一〇/07/22 –// Email : netwild@163.com –// QQ :
52100641 –// ============================ SET QUOTED_IDENTIFIER ON GO
SET ANSI_NULLS ON GO CREATE PROC execByPage @sqlQuery varchar(贰零零叁卡塔尔,
–//输入参数: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(二〇〇一State of Qatar declare
@sqlQuery2 varchar(二〇〇三卡塔尔 set @sqlQuery1 =
substring(@sqlQuery,1,@subIndex – 1State of Qatar set @sqlQuery2 =
substring(@sqlQuery,@subIndex,len(@sqlQuery卡塔尔State of Qatar set @sqlQuery = @sqlQuery1

  • ‘,IDENTITY(numeric,1,1) as ID1516 into ‘ + @tmpTableName + ‘ ‘ +
    @sqlQuery2 end else –//不带FROM的表名 begin set @sqlQuery = ‘select
    *www.463.com,,IDENTITY(numeric,1,1卡塔尔(قطر‎ as ID1516 into ‘ + @tmpTableName + ‘ from’ +
    @sqlQuery end exec(@sqlQuery卡塔尔国 –//创设并初阶化有时表数据 declare
    @indexStart varchar(20卡塔尔国,@indexEnd varchar(20State of Qatar 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(ID1516State of Qatar as recordCount from ‘ + @tmpTableNameState of Qatar–//提取总条数 exec(‘drop table ‘ + @tmpTableName卡塔尔国 –//删除有的时候表 GO SET
    QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO [/code]

发表评论

电子邮件地址不会被公开。 必填项已用*标注