基本的思路有如下几种:
- 从12.5.3版本开始sybase支持top关键字,试着使用,但是未果(同事说sybase对top支持不好),因为不支持嵌套。使用的是如下的sql:
select top 10 t1.AH, t1.BH from K_ZS..B_MS t1 where t1.BH not in (select top 20 t2.BH from K_ZS..B_MS t2)
这里的是不带order by的,另外一种是带order by的,效率会比较高。
-
在存储过程端使用set rowcount 来实现分页,没有试验。
-
用存储过程,建立临时表,获取数据,然后动态sql获得临时表数据。最后从网上找到的如下的两个分页存储过程:
-- 按行读取
CREATE PROCEDURE GetDataByLine
(
--创建一个分页读取过程
@SqlStr varchar(8000), --SQL语句
@FirstRec int, --页起始行
@LastRec int --页结束行
)
AS
DECLARE @dt varchar(10) --生成临时表的随机数
BEGIN
SELECT @dt= substring(convert(varchar, rand()), 3, 10) --一个字符型的随机数
--将搜索结果放入临时表中,表名随机生成,在' FROM '前插入'INTO '+随机临时表名
SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ', upper(@SqlStr)), 6 ,' INTO tempdb..Lining' + @dt + ' FROM ')
EXECUTE (@SqlStr)
--为临时表增加id号
SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
EXECUTE (@SqlStr)
--计算临时表中的记录数
--SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
--EXECUTE (@SqlStr)
--选取记录号在起始行和结束行中间的记录
SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar, @FirstRec) + ' and TEMPDB_ID <= ' + convert(varchar, @LastRec)
EXECUTE (@SqlStr)
--删除临时表
SELECT @SqlStr = 'DROP TABLE tempdb..Lining'+@dt
EXECUTE (@SqlStr)
END
/*
some comments:
1.@SqlStr varchar(8000), depends on your page size
2. this is a generic paging sp, if you just want to use it for specific table,
you'd better change the 'tempdb..Lining' to #Paging, the performance will be better
*/
-- 按页读取
CREATE PROCEDURE GetDataByPage
(
--创建一个分页读取过程
@SqlStr varchar(8000), --SQL语句
@PageSize int, --每页记录数
@CurrentPage int --当前页数
)
AS
DECLARE @FirstRec int, @LastRec int, @dt varchar(10) --页起始行,页结束行,生成临时表的随机数
BEGIN
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize --计算页起始行
SELECT @LastRec = (@CurrentPage * @PageSize + 1) --计算页结束行
SELECT @dt= substring(convert(varchar,rand()),3,10) --一个字符型的随机数
--将搜索结果放入临时表中,表名随机生成,在' FROM '前插入'INTO '+随机临时表名
SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ',upper(@SqlStr)), 6 ,' INTO tempdb..Paging'+@dt+' FROM ')
EXECUTE (@SqlStr)
--为临时表增加id号
SELECT @SqlStr = 'ALTER TABLE tempdb..Paging'+@dt+' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
EXECUTE (@SqlStr)
--计算临时表中的记录数
--SELECT @SqlStr = 'SELECT Count(*) From tempdb..Paging'+@dt
--EXECUTE (@SqlStr)
--选取记录号在起始行和结束行中间的记录
SELECT @SqlStr = 'SELECT * FROM tempdb..Paging'+@dt+' WHERE TEMPDB_ID > '+convert(varchar,@FirstRec)+' and TEMPDB_ID < '+convert(varchar,@LastRec)
EXECUTE (@SqlStr)
--删除临时表
SELECT @SqlStr = 'DROP TABLE tempdb..Paging'+@dt
EXECUTE (@SqlStr)
END
/*
some comments:
1. @SqlStr varchar(8000), depends on your page size
2. this is a generic paging sp, if you just want to use it for specific table,
you'd better change the 'tempdb..Paging' to #Paging, the performance will be better
*/
-- 清空日志
Dump Transaction DB_BD With truncate_only
go
use DB_BD
go
if exists( select 1 from sysobjects
where id = object_id( 'PR_GET_PAGESIZE' )
and sysstat & 15 = 4 )
drop procedure PR_GET_PAGESIZE
go
create procedure PR_GET_PAGESIZE (
@SqlStr varchar(8000), -- SQL语句
@PageSize int, -- 每页记录数
@CurrentPage int -- 当前页数
)
as
begin
declare @FirstRec int, -- 页起始行
@maxCount int, -- 页结束行
@dt varchar(10) -- 生成临时表的随机数
select @FirstRec = (@CurrentPage - 1) * @PageSize -- 计算页起始行
-- 将搜索结果放入临时表中,表名随机生成,在' from '前插入'into '+随机临时表名
select @SqlStr = stuff(@SqlStr, charindex(' from ',lower(@SqlStr)), 6,
', TEMPDB_ID = identity(11) into #temp_page from ')
-- 设置结束行
select @maxCount = @PageSize*@CurrentPage
select @SqlStr = 'set rowcount ' + convert(varchar, @maxCount)
+ ' ' + @SqlStr
+ ' set rowcount 0 '
-- 选取记录号在起始行和结束行中间的记录
select @SqlStr = @SqlStr + ' select * from #temp_page where TEMPDB_ID > ' + convert(varchar, @FirstRec)
print '%1!', @SqlStr
execute (@SqlStr)
end
go
sp_procxmode PR_GET_PAGESIZE, anymode
go
分享到:
相关推荐
本文详细介绍了如何在 Sybase 数据库中通过编写存储过程实现分页功能。这种方法不仅可以提高查询效率,还可以减少网络传输的数据量,从而提升用户体验。需要注意的是,在实际应用中还需要考虑更多细节问题,比如错误...
### C#使用ODBC连接SYBASE数据库的方法 #### 背景介绍 随着技术的发展,企业内部往往会使用多种类型的数据库来满足不同的业务需求。Sybase作为一个成熟的关系型数据库管理系统,在某些特定领域仍然有着广泛的应用。...
首先,"sybase海量数据分页瞬间完成2.0"表明这是一个针对Sybase数据库的分页性能优化升级。在前一版本中可能存在的问题包括连接未正确释放、小数据量查询速度慢、缓存未有效清除以及重复缓存。这些问题会直接影响...
本篇文章将详细讲解如何利用JDBC在Sybase数据库中进行高效的分页查询。 首先,理解分页的基本概念。分页是将大结果集分割成较小的部分,每次只返回一部分数据,通常由页码和每页记录数来定义。在Sybase中,可以使用...
在IT行业中,数据库分页是数据检索的一个重要技术,特别是在处理大数据量时,为了提高用户体验和系统性能。本文将深入探讨“独立的跨数据库的分页”这一主题,结合Java编程语言,阐述如何实现对Oracle、Sybase、SQL ...
标题中的“sybase通用分页模块”指的是在Sybase数据库管理系统中实现的一种功能,用于处理大量数据时的分页查询。这种模块对于提高系统性能、优化用户体验至关重要,尤其是在数据分析、报表展示或者网页应用中,用户...
sybase分页存储过程(代码),分页存储过程代码,实现sybase数据库分页查询。
在数据库管理领域,Sybase是一种广泛使用的数据库系统,特别是在企业级应用中。本文将深入探讨在Sybase中进行分页查询的优化,并结合排序这一关键功能进行详细解析。分页和排序是数据检索中常见的需求,尤其是在大...
在众多的SQL操作中,分页查询是数据库管理员和开发人员频繁使用的场景之一,尤其是在处理大量数据时,有效地进行分页不仅能够提升查询性能,还能优化用户体验。以下是对分页SQL查询技术的深入解析,旨在帮助读者理解...
而ADODB(Active Record Database Abstraction Layer)类库则为PHP提供了一个强大的数据库抽象层,使得开发者能够轻松地在多种数据库系统间进行切换,包括MySQL、Oracle、DB、Sybase和mSQL等。ADODB的主要目标是简化...
5. **不仅仅用于数据库分页**:除了常见的数据库查询结果分页外,还可以用于文章内容的分页显示。这就意味着分页类的设计应该足够灵活,能够应对不同类型的数据源。 #### 三、使用示例 下面通过几个具体示例来展示...
这种方法不仅适用于基于Sybase数据库的应用程序,也适用于其他类型的数据库系统。 #### 参考文献 由于提供的内容没有给出具体的参考文献,这里不做引用。但在实际的研究或开发过程中,应详细列出所参考的所有文献...
* 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 * 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢...
SQL Anywhere 5.0是由Sybase公司开发的一款轻量级数据库管理系统,它以其强大的移动和嵌入式数据库解决方案而闻名。在中石油等大型企业中,SQL Anywhere常用于管理各种关键业务数据,确保在分布式环境下的高效运行和...
- 搭建SYBASE数据库环境,包括硬件准备、软件安装等。 **4. 数据库移植** - 进行数据库结构和数据的迁移,包括表结构、存储过程、视图等对象的转换。 **5. 应用测试** - 对移植后的系统进行全面的功能性和性能测试...
Sybase Adaptive Server Enterprise(简称ASE)是Sybase公司推出的一款高性能、高可用性的企业级数据库管理系统,广泛应用于金融、电信、制造等多个行业。版本15.0.3是其发展历程中的一个重要版本,该版本在多个操作...
在进行小型机重启前,还需要停止正在运行的Sybase数据库系统,以确保数据的安全性。 **步骤1:** 在小型机命令行中输入: ``` cd /sybase ``` 切换到Sybase的安装目录。 **步骤2:** 运行停机脚本: ``` ./stop.sh `...
Sybase数据库连接 - **驱动加载**: ```java Class.forName("com.sybase.jdbc.SybDriver"); ``` - **连接字符串**: ```java String url = "jdbc:sybase:Tds:localhost:5007/myDB"; // myDB 为数据库名 ...
首先,Jtds.jar是一款开源的JDBC驱动,它提供了一个高效、功能丰富的接口来与SQL Server和Sybase数据库通信。相比于官方的Microsoft JDBC驱动,Jtds.jar具有更小的体积和更快的执行速度,同时在某些特定场景下可能...