当前位置:  数据库>sqlserver

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

    来源: 互联网  发布时间:2014-10-04

    本文导语:  正常情况下,SQL Server服务器上会对使用频率大的Table建立合适的索引 这样能大幅度的提高数据库本身的数据检索速度,建立索引的方法就不细说了 如果需要返回大量数据,从几百行到几万行,甚至几十万行数据 这时会发现响...

正常情况下,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]

    
 
 

您可能感兴趣的文章:

  • sql 游标的使用—游标FOR循环小例子
  • MS SQL Server游标(CURSOR)的学习使用
  • sql游标的用法简单笔记
  • 教你怎么使用sql游标实例分享
  • sql 取代游标的写法示例
  • sql 游标使用笔记
  • T-SQL常用游标函数实例学习
  • SQL Server 游标语句使用示例
  • SQL Server 游标语句 声明/打开/循环实例
  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)
  • sql server中嵌套游标的例子
  • 在Oracle PL/SQL中游标声明中表名动态变化的方法
  • Sql Server遍历表记录的二种方法(表变量与游标)
  • SQL Server遍历表中记录的2种方法(使用表变量和游标)
  • 用jdbc对access数据库进行操作时出现异常:java.sql.SQLException: [Microsoft][ODBC 驱动程序 管理器] 非法的游标状态
  • SQL Server通用分页存储过程(非游标方式)
  • SQL server使用自定义函数以及游标
  • SQL Server游标的使用/关闭/释放/优化小结
  • 学习 SQL Server 2005游标
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问Linux数据库编程是否也可以支持通用的SQL语言进行数据库编写.
  • 基于Sql Server通用分页存储过程的解决方法
  • SQL Server 分页查询通用存储过程(只做分页查询用)
  • 将mater库中的系统存储过程批量生成*.sql文件 通用且非常实用
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口rowid的类成员方法: tostring定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间javax.sql.rowset接口joinrowset的类成员方法: getwhereclause定义及介绍
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • java命名空间java.sql接口statement的类成员方法: execute定义及介绍
  • sql2005 大数据量检索分页的sql代码
  • java命名空间java.sql接口resultset的类成员方法: getcursorname定义及介绍
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • java命名空间java.sql接口resultsetmetadata的类成员方法: getcolumntype定义及介绍
  • 微软网站下载的Ms SQL Server2000 JDBC Driver,必须用英文版的SQL server2000吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    SQL客户端管理工具 SQuirreL SQL Client iis7站长之家