歲月如哥
          人生非夢(mèng)
          posts - 50,comments - 144,trackbacks - 0

                基本的思路有如下幾種:

          1. 從12.5.3版本開(kāi)始sybase支持top關(guān)鍵字,試著使用,但是未果(同事說(shuō)sybase對(duì)top支持不好),因?yàn)椴恢С智短住J褂玫氖侨缦碌膕ql:  
            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的,效率會(huì)比較高。
          2. 在存儲(chǔ)過(guò)程端使用set rowcount 來(lái)實(shí)現(xiàn)分頁(yè),沒(méi)有試驗(yàn)。
          3. 用存儲(chǔ)過(guò)程,建立臨時(shí)表,獲取數(shù)據(jù),然后動(dòng)態(tài)sql獲得臨時(shí)表數(shù)據(jù)。最后從網(wǎng)上找到的如下的兩個(gè)分頁(yè)存儲(chǔ)過(guò)程:
            -- 按行讀取

            CREATE PROCEDURE GetDataByLine
            (
                    
            --創(chuàng)建一個(gè)分頁(yè)讀取過(guò)程
                @SqlStr         varchar(8000),    --SQL語(yǔ)句
                @FirstRec       int,        --頁(yè)起始行
                @LastRec        int        --頁(yè)結(jié)束行
            )
            AS
            DECLARE @dt varchar(10)    --生成臨時(shí)表的隨機(jī)數(shù)
            BEGIN

                
            SELECT @dt= substring(convert(varcharrand()), 310)    --一個(gè)字符型的隨機(jī)數(shù)
                
                
            --將搜索結(jié)果放入臨時(shí)表中,表名隨機(jī)生成,在' FROM '前插入'INTO '+隨機(jī)臨時(shí)表名
                SELECT @SqlStr = stuff(@SqlStrcharindex(' FROM 'upper(@SqlStr)), 6 ,' INTO tempdb..Lining' + @dt + ' FROM ')
                
            EXECUTE (@SqlStr)
                
                
            --為臨時(shí)表增加id號(hào)
                SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
                
            EXECUTE (@SqlStr)
                
                
            --計(jì)算臨時(shí)表中的記錄數(shù)
                --SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
                --EXECUTE (@SqlStr)
                
                
            --選取記錄號(hào)在起始行和結(jié)束行中間的記錄
                SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar@FirstRec+ ' and TEMPDB_ID <= ' + convert(varchar@LastRec)
                
            EXECUTE (@SqlStr)
                
                
            --刪除臨時(shí)表
                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
            */

            -- 按頁(yè)讀取

            CREATE PROCEDURE GetDataByPage
            (
                
            --創(chuàng)建一個(gè)分頁(yè)讀取過(guò)程
                @SqlStr         varchar(8000),    --SQL語(yǔ)句
                @PageSize       int,            --每頁(yè)記錄數(shù)
                @CurrentPage    int                --當(dāng)前頁(yè)數(shù)
            )
            AS
            DECLARE @FirstRec int@LastRec int@dt varchar(10)    --頁(yè)起始行,頁(yè)結(jié)束行,生成臨時(shí)表的隨機(jī)數(shù)
            BEGIN

                
            SELECT @FirstRec = (@CurrentPage - 1* @PageSize    --計(jì)算頁(yè)起始行
                SELECT @LastRec = (@CurrentPage * @PageSize + 1)    --計(jì)算頁(yè)結(jié)束行
                
                
            SELECT @dt= substring(convert(varchar,rand()),3,10)    --一個(gè)字符型的隨機(jī)數(shù)
                
                
            --將搜索結(jié)果放入臨時(shí)表中,表名隨機(jī)生成,在' FROM '前插入'INTO '+隨機(jī)臨時(shí)表名
                SELECT @SqlStr = stuff(@SqlStrcharindex(' FROM ',upper(@SqlStr)), 6 ,' INTO tempdb..Paging'+@dt+' FROM ')
                
            EXECUTE (@SqlStr)
                
                
            --為臨時(shí)表增加id號(hào)
                SELECT @SqlStr = 'ALTER TABLE tempdb..Paging'+@dt+' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
                
            EXECUTE (@SqlStr)
                
                
            --計(jì)算臨時(shí)表中的記錄數(shù)
                --SELECT @SqlStr = 'SELECT Count(*) From tempdb..Paging'+@dt
                --EXECUTE (@SqlStr)
                
                
            --選取記錄號(hào)在起始行和結(jié)束行中間的記錄
                SELECT @SqlStr = 'SELECT * FROM tempdb..Paging'+@dt+' WHERE TEMPDB_ID > '+convert(varchar,@FirstRec)+' and TEMPDB_ID < '+convert(varchar,@LastRec)
                
            EXECUTE (@SqlStr)
                
                
            --刪除臨時(shí)表
                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語(yǔ)句
              @PageSize       int,                  -- 每頁(yè)記錄數(shù)
              @CurrentPage    int                      -- 當(dāng)前頁(yè)數(shù)
          )
          as
          begin
              
          declare @FirstRec int,     -- 頁(yè)起始行  
                    @maxCount int,     -- 頁(yè)結(jié)束行
                    @dt varchar(10)       -- 生成臨時(shí)表的隨機(jī)數(shù)
              select @FirstRec = (@CurrentPage - 1* @PageSize    -- 計(jì)算頁(yè)起始行
              
              
              
          -- 將搜索結(jié)果放入臨時(shí)表中,表名隨機(jī)生成,在' from '前插入'into '+隨機(jī)臨時(shí)表名
              select @SqlStr = stuff(@SqlStrcharindex(' from ',lower(@SqlStr)), 6,
                
          ', TEMPDB_ID = identity(11) into #temp_page from ')
              
              
          -- 設(shè)置結(jié)束行
              select @maxCount = @PageSize*@CurrentPage
              
          select @SqlStr = 'set rowcount ' + convert(varchar@maxCount
                              
          +  ' ' + @SqlStr 
                              
          + '  set rowcount 0 '
              
              
          -- 選取記錄號(hào)在起始行和結(jié)束行中間的記錄  
              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 歲月如歌 閱讀(2931) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): db

          FeedBack:
          # re: sybase數(shù)據(jù)庫(kù)端分頁(yè)[未登錄](méi)
          2011-12-15 11:53 | 小刀
          那兩個(gè)分頁(yè)存儲(chǔ)過(guò)程還不錯(cuò),就是效率不是很高,望斑竹繼續(xù)努力~~  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 北票市| 绥芬河市| 宣汉县| 慈溪市| 武城县| 循化| 高安市| 竹北市| 会昌县| 绥宁县| 西畴县| 禄丰县| 扎囊县| 浙江省| 信宜市| 桐柏县| 新巴尔虎左旗| 错那县| 股票| 嘉义县| 郎溪县| 宁武县| 山阳县| 满城县| 潜江市| 交口县| 淅川县| 同仁县| 叶城县| 藁城市| 林州市| 子洲县| 会宁县| 宝应县| 四川省| 巫山县| 衡南县| 张家港市| 鄂伦春自治旗| 嵊泗县| 枝江市|