`
midstr
  • 浏览: 31971 次
  • 性别: 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中实现分页技术的存储过程 procedures

    sybase分页存储过程(代码)

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

    独立的跨数据库的分页

    独立的跨数据库的java分页:可连接oracle,sybase,sqlserver,mysql! 项目涉及分页只需拷贝简单修改即可! 有相应的ppt讲解

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

    5 分页不仅限于数据库分页。有些是对内容的分页,比如把一篇长达上万字的内容进行分页,这样如果把SQL写到类里面的,就更要不得了,一点用也没有。 BluePage是一个通用的分页类,它能帮助你更快地完成分页任务。 ...

    asp.net利用存储过程分页代码

    asp.net利用存储过程分页代码,代码很详细,有建库脚本和页面的调用。

    数据库底层操作与配置V2.1

    该版本相对于2.0增加了自编译数据表字段,不再需要使用CodeSmith工具,真正实现代码的自动化,同进修正了在分页查询出现的问题 本工具附有详细的使用说明,有助于用户更好地使用本工具 如有问题请联系...

    JTurboExplorer:MySQL,Oracle,Sybase等数据库浏览器。 来源制造商JSF。-开源

    列出数据库,MySQL,Oracle和Sybase的表和视图。 从Excel 97-2003文件加载数据,将数据从表导出到Excel 97-2003文件。 从表生成存储过程以进行插入,更新,删除,查询和分页。 从表中生成代码JSF2.0(Action)和...

    VBC#.Net实体代码生成工具

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于各种...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)_4.3

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于各种...

    vb/c#.net实体代码生成工具(entityscodegenerate

    目前直接支持oracle、sqlserver、sybase、db2、access、mysql、sqlite、postgresql、dm(达梦)、oledb和custom(自定义)类型的数据库、powerdesigner文件,同时也支持informix、firebird、maxdb、odbc等,可用于各种...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.7

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.4

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于各种...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.5

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于各种...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.6

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于各种...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.7 201705更新

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于...

    VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.8

    目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于...

    DBKING使用指南

    比如:数据库分页,你不用再关心记录总数怎么取,不用考虑各种数据库之间的差异,最关键的是绝对的高效。再比如LOB字段的处理,可以直接通过增、删、改、查等接口处理,遇到较大的LOB,也可以用流的方式处理,避免...

    SocanCode7.4.2

    •内置一套强大的C#三层架构模板,此模板支持生成简单三层及工厂模式三层,支持生成VS2005/2008/2010解决方案、支持生成缓存代码、支持生成分页代码 •内置一套MySql和SqlServer的存储过程模板 •支持直接执行SQL...

Global site tag (gtag.js) - Google Analytics