`
midstr
  • 浏览: 33226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sybase数据库端分页

    博客分类:
  • db
阅读更多

      基本的思路有如下几种:

  1. 从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的,效率会比较高。
  2. 在存储过程端使用set rowcount 来实现分页,没有试验。
  3. 用存储过程,建立临时表,获取数据,然后动态sql获得临时表数据。最后从网上找到的如下的两个分页存储过程:
    -- 按行读取

    CREATE PROCEDURE GetDataByLine
    (
            
    --创建一个分页读取过程
        @SqlStr         varchar(8000),    --SQL语句
        @FirstRec       int,        --页起始行
        @LastRec        int        --页结束行
    )
    AS
    DECLARE @dt varchar(10)    --生成临时表的随机数
    BEGIN

        
    SELECT @dt= substring(convert(varcharrand()), 310)    --一个字符型的随机数
        
        
    --将搜索结果放入临时表中,表名随机生成,在' FROM '前插入'INTO '+随机临时表名
        SELECT @SqlStr = stuff(@SqlStrcharindex(' 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(@SqlStrcharindex(' 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 existsselect 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(@SqlStrcharindex(' 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 实现分页的存储过程

    本文详细介绍了如何在 Sybase 数据库中通过编写存储过程实现分页功能。这种方法不仅可以提高查询效率,还可以减少网络传输的数据量,从而提升用户体验。需要注意的是,在实际应用中还需要考虑更多细节问题,比如错误...

    C#使用ODBC连接SYBASE数据库的方法

    ### C#使用ODBC连接SYBASE数据库的方法 #### 背景介绍 随着技术的发展,企业内部往往会使用多种类型的数据库来满足不同的业务需求。Sybase作为一个成熟的关系型数据库管理系统,在某些特定领域仍然有着广泛的应用。...

    sybase海量数据分页瞬间完成2.0

    首先,"sybase海量数据分页瞬间完成2.0"表明这是一个针对Sybase数据库的分页性能优化升级。在前一版本中可能存在的问题包括连接未正确释放、小数据量查询速度慢、缓存未有效清除以及重复缓存。这些问题会直接影响...

    sybase分页代码使用jdbc分页速度快适合大数据

    本篇文章将详细讲解如何利用JDBC在Sybase数据库中进行高效的分页查询。 首先,理解分页的基本概念。分页是将大结果集分割成较小的部分,每次只返回一部分数据,通常由页码和每页记录数来定义。在Sybase中,可以使用...

    独立的跨数据库的分页

    在IT行业中,数据库分页是数据检索的一个重要技术,特别是在处理大数据量时,为了提高用户体验和系统性能。本文将深入探讨“独立的跨数据库的分页”这一主题,结合Java编程语言,阐述如何实现对Oracle、Sybase、SQL ...

    sybase通用分页模块

    标题中的“sybase通用分页模块”指的是在Sybase数据库管理系统中实现的一种功能,用于处理大量数据时的分页查询。这种模块对于提高系统性能、优化用户体验至关重要,尤其是在数据分析、报表展示或者网页应用中,用户...

    sybase分页存储过程(代码)

    sybase分页存储过程(代码),分页存储过程代码,实现sybase数据库分页查询。

    sybase分页优化带排序

    在数据库管理领域,Sybase是一种广泛使用的数据库系统,特别是在企业级应用中。本文将深入探讨在Sybase中进行分页查询的优化,并结合排序这一关键功能进行详细解析。分页和排序是数据检索中常见的需求,尤其是在大...

    分页的sql总结

    在众多的SQL操作中,分页查询是数据库管理员和开发人员频繁使用的场景之一,尤其是在处理大量数据时,有效地进行分页不仅能够提升查询性能,还能优化用户体验。以下是对分页SQL查询技术的深入解析,旨在帮助读者理解...

    php 操作数据库adodb类

    而ADODB(Active Record Database Abstraction Layer)类库则为PHP提供了一个强大的数据库抽象层,使得开发者能够轻松地在多种数据库系统间进行切换,包括MySQL、Oracle、DB、Sybase和mSQL等。ADODB的主要目标是简化...

    BluePage通用分页类助开发者提高开发效率1

    5. **不仅仅用于数据库分页**:除了常见的数据库查询结果分页外,还可以用于文章内容的分页显示。这就意味着分页类的设计应该足够灵活,能够应对不同类型的数据源。 #### 三、使用示例 下面通过几个具体示例来展示...

    基于JavaBean的分页技术

    这种方法不仅适用于基于Sybase数据库的应用程序,也适用于其他类型的数据库系统。 #### 参考文献 由于提供的内容没有给出具体的参考文献,这里不做引用。但在实际的研究或开发过程中,应详细列出所参考的所有文献...

    SpringBoot集成MyBatis-Plus实现国产数据库适配.docx

    * 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 * 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢...

    sybase sqlanywhere5.0

    SQL Anywhere 5.0是由Sybase公司开发的一款轻量级数据库管理系统,它以其强大的移动和嵌入式数据库解决方案而闻名。在中石油等大型企业中,SQL Anywhere常用于管理各种关键业务数据,确保在分布式环境下的高效运行和...

    SYBASE技术资料

    - 搭建SYBASE数据库环境,包括硬件准备、软件安装等。 **4. 数据库移植** - 进行数据库结构和数据的迁移,包括表结构、存储过程、视图等对象的转换。 **5. 应用测试** - 对移植后的系统进行全面的功能性和性能测试...

    sybase ASE 15.0.3版各功能在所有平台上的可用性

    Sybase Adaptive Server Enterprise(简称ASE)是Sybase公司推出的一款高性能、高可用性的企业级数据库管理系统,广泛应用于金融、电信、制造等多个行业。版本15.0.3是其发展历程中的一个重要版本,该版本在多个操作...

    小型机重启操作方法

    在进行小型机重启前,还需要停止正在运行的Sybase数据库系统,以确保数据的安全性。 **步骤1:** 在小型机命令行中输入: ``` cd /sybase ``` 切换到Sybase的安装目录。 **步骤2:** 运行停机脚本: ``` ./stop.sh `...

    JDBC连接各种数据库的代码

    Sybase数据库连接 - **驱动加载**: ```java Class.forName("com.sybase.jdbc.SybDriver"); ``` - **连接字符串**: ```java String url = "jdbc:sybase:Tds:localhost:5007/myDB"; // myDB 为数据库名 ...

    使用Jtds.jar连接数据库的简单例子

    首先,Jtds.jar是一款开源的JDBC驱动,它提供了一个高效、功能丰富的接口来与SQL Server和Sybase数据库通信。相比于官方的Microsoft JDBC驱动,Jtds.jar具有更小的体积和更快的执行速度,同时在某些特定场景下可能...

Global site tag (gtag.js) - Google Analytics