歲月如哥
          人生非夢
          posts - 50,comments - 144,trackbacks - 0

                基本的思路有如下幾種:

          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
          posted on 2008-10-14 16:36 歲月如歌 閱讀(2932) 評論(1)  編輯  收藏 所屬分類: db

          FeedBack:
          # re: sybase數據庫端分頁[未登錄]
          2011-12-15 11:53 | 小刀
          那兩個分頁存儲過程還不錯,就是效率不是很高,望斑竹繼續努力~~  回復  更多評論
            
          主站蜘蛛池模板: 成安县| 澄江县| 鄯善县| 富蕴县| 聊城市| 诸暨市| 襄城县| 沅江市| 南京市| 清原| 湛江市| 江津市| 崇仁县| 长兴县| 读书| 蕉岭县| 大化| 德兴市| 高州市| 鄂托克旗| 临朐县| 岳普湖县| 东乌珠穆沁旗| 汽车| 洮南市| 望奎县| 济源市| 宜昌市| 广元市| 云龙县| 望谟县| 岑巩县| 卢氏县| 湖南省| 辽源市| 东城区| 台山市| 灯塔市| 凤山县| 和林格尔县| 怀来县|