<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統(tǒng)計(jì)

    最新評論

    通過存儲過程對SQLSERVER2005分頁

    1 通過select top進(jìn)行分頁查詢   
    /*查詢原理:需要查詢第N頁時,首先取到前N頁的所有數(shù)據(jù),然后排除前N-1頁的數(shù)據(jù),就是第N頁的數(shù)據(jù)*/  
    create  PROCEDURE GetDataWithPage  
    (   
           @pageIndex  int = 1,           -- 頁碼  
          @pageSize   int = 20,          -- 頁尺寸    
    )  
    as  
        begin  
         if @pageIndex < 1  
    begin  
    Set @pageIndex=1  
    end                   
      
      
    --如果是第一頁時要執(zhí)行的語句  
      if @PageIndex = 1  
          begin  
                  select top ((@PageIndex)*@PageSize)   
                   field1,field2,--查詢字段  
                   fieldOrderby --排序字段,按什么字段分頁的字段,建議使用主鍵,或者唯一鍵  
                   from tableName --查詢表名稱  
                  where id>100 --查詢條件  
                  order by fieldOrderby --排序字段,按什么字段分頁的字段,  
                 select count(*) as Total from tableName where id>100--返回總記錄數(shù)  
        end  
      else    
             begin  
                     select top ((@PageIndex)*@PageSize) --取出前PageIndex頁的數(shù)據(jù)  
                                field1,field2,--查詢字段  
                                fieldOrderby --排序字段,按什么字段分頁的字段,建議使用主鍵,或者唯一鍵  
                                into #tempTable --插入臨時表  
                                from tableName --查詢表名稱  
                                where id>100 --查詢條件  
                               order by fieldOrderby --排序字段,按什么字段分頁的字段,  
                      -----取出前pageIndex頁數(shù)據(jù)插入臨時表  
      
                     ------排除前pageIndex-1頁的數(shù)據(jù),取出第pageIndex的數(shù)據(jù)  
                      select top (@PageIndex) --  
                                 field1,field2,--排序字段  
                                fieldOrderby --  
                               from #tempTable --從臨時表中取數(shù)據(jù)  
                              where fieldOrderby --  
                              not in (select  top ((@PageIndex-1)*@PageSize) fieldOrderby from #tempTable)  
                            ---- 從臨時表取出 pageIndex的數(shù)據(jù)   
                                ----可以根據(jù)升序或者降序把not in 改為 <min(fieldOrderby)或者>max(fieldOrderby)  
                     select count(*) as Total from tableName where id>100--返回總記錄數(shù)  
           end  
    end  


    2通過系統(tǒng)存儲過程進(jìn)行分頁查詢

    [sql] view plaincopy
     /*  
     一共返回三個表第一個表為空 查詢字符串的條件中有 like ,in 可能出現(xiàn)問題,具體出現(xiàn)原因不明,第二個表包含總頁數(shù),總行數(shù),  
    當(dāng)前頁第三個表包含查詢記錄  
      
    */  
    create   procedure [dbo].[GetOnePageData]  
       @sqlstr nvarchar(4000), --查詢字符串  ,就是一般的查詢語句,不需要top關(guān)鍵字  
       @currentpage int, --第N頁  
       @pagesize int --每頁行數(shù)  
    as  
       set nocount on  
       declare @P1 int, --P1是游標(biāo)的id  
       @rowcount int--  
        exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output  
       --定義與游標(biāo)和游標(biāo)選項(xiàng)相關(guān)聯(lián)的 SQL 語句,然后填充游標(biāo)。  
       --選擇總頁數(shù),總行數(shù),當(dāng)前頁  
        select ceiling(1.0*@rowcount/@pagesize) as TotalPages,@rowcount as TotalRows,@currentpage as CurPage  
        set @currentpage=(@currentpage-1)*@pagesize+1  
       --查詢記錄  
        exec sp_cursorfetch @P1,16,@currentpage,@pagesize --從游標(biāo)中提取一行或一個行塊。  
       --返回值  
        exec sp_cursorclose @P1--關(guān)閉并釋放游標(biāo)  
         set nocount off  
    go  


    3 通過新函數(shù)ROW_NUMBER()進(jìn)行分頁查詢

    [sql] view plaincopy
    /*  
    適用于sql2005,據(jù)調(diào)查此方法限制最少,性能最佳  
    返回兩個表,第一個表包含總行數(shù),第二個表是查詢到的記錄  
    --分頁查詢的原理:  
    --1.先將預(yù)分頁內(nèi)容按照排序條件加上自增列導(dǎo)入到臨時表中(或表變量)  
    --2.針對臨時表操作,找到相應(yīng)的N頁對應(yīng)的自增列編碼范圍  
    --3.根據(jù)第N頁對應(yīng)的自增列編碼范圍,查找第N頁內(nèi)容  
       
    --需要注意的是:  
    --第一是添加自增列,確定行號  
    --第二縮減中間處理過程的操作數(shù)據(jù)量  
      
    */  
      
    create  proc [dbo].[GetOnePageData]--//  
    (  
        @page int,  
        @pagesize int  
    )  
    as  
    begin      
            select top  (@pagesize*@page)  ROW_NUMBER() --可以減少處理的數(shù)據(jù),加快速度  
             OVER(ORDER BY NodeID) as rowNum,--按什么字段分頁的字段,不需要唯一性  
            NodeID,NodeName,ControlIP --查詢字段  
            into #temp --插入臨時表  
            from TableName   --  查詢表名稱   
            where NodeID>100 --查詢條件  
             
           select count(*) from #temp--總記錄條數(shù)  
           select * from #temp where rowNum>@pagesize*(@page-1) and rowNum<=@pagesize*@page--  
    end   

      綜述,如果需要通用的存儲過程,可以把第一或者第三種分頁方法進(jìn)行改寫,在數(shù)據(jù)庫拼字符串,但性能會差好多。這或許就是通用和性能之間的矛盾吧。















    posted on 2012-08-29 21:31 奮斗成就男人 閱讀(824) 評論(0)  編輯  收藏 所屬分類: SQL

    主站蜘蛛池模板: 亚洲精品亚洲人成人网| 久久久www成人免费毛片| 草久免费在线观看网站| 看一级毛片免费观看视频| 亚洲第一视频在线观看免费| 亚洲免费人成在线视频观看| av免费不卡国产观看| 免费在线观看日韩| 久久国产亚洲精品麻豆| 亚洲午夜电影一区二区三区| 亚洲伦理中文字幕| 国产亚洲人成在线影院| 日本大片在线看黄a∨免费| 亚洲av无码一区二区乱子伦as| 在线观看亚洲AV每日更新无码| 一级毛片视频免费| 成人超污免费网站在线看| 亚洲精品无码mv在线观看网站| 免费人成激情视频在线观看冫| 成人午夜免费福利视频| 亚洲激情视频图片| 日本最新免费不卡二区在线| 一级毛片免费视频网站| 亚洲成av人片在线观看无码不卡| 日韩午夜理论免费TV影院| 亚洲国产一区二区三区| 亚洲码在线中文在线观看| 国产乱子伦精品免费视频| 四虎www免费人成| 亚洲乱码在线视频| 日韩免费视频一区| 99在线免费观看| 亚洲精品动漫人成3d在线| 日韩精品免费在线视频| 国产偷国产偷亚洲高清日韩 | 日本高清不卡中文字幕免费| 67194成是人免费无码| 无码天堂亚洲国产AV| aa级一级天堂片免费观看| 亚洲综合视频在线观看| 免费理论片51人人看电影|