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

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

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

    yxhxj2006

    常用鏈接

    統(tǒng)計

    最新評論

    通過存儲過程對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 奮斗成就男人 閱讀(815) 評論(0)  編輯  收藏 所屬分類: SQL

    主站蜘蛛池模板: 精品久久久久久亚洲| 久久亚洲国产成人精品无码区| 老汉色老汉首页a亚洲| 免费一级毛片无毒不卡| 国产亚洲美女精品久久久久狼 | 亚洲欧美不卡高清在线| 毛片免费在线观看网址| 精品国产日韩久久亚洲| 在线观看免费精品国产| 边摸边脱吃奶边高潮视频免费 | 日韩免费视频播播| 美女无遮挡免费视频网站| 亚洲成AⅤ人影院在线观看| 污视频网站在线免费看| 在线精品亚洲一区二区小说| 免费无码又爽又刺激高潮软件| 久久久久亚洲Av无码专| 中文字幕无码播放免费| 亚洲精品欧美综合四区| 午夜亚洲国产成人不卡在线| 天堂在线免费观看| 亚洲精品一区二区三区四区乱码 | 看Aⅴ免费毛片手机播放| 亚洲欧洲国产成人综合在线观看 | 成人久久久观看免费毛片| 亚洲精品无码久久久久| 0588影视手机免费看片| 亚洲av无码成人影院一区| 亚洲午夜日韩高清一区| 99久久综合精品免费| 亚洲日韩国产二区无码| 亚洲男女内射在线播放| 18禁美女裸体免费网站| 亚洲第一成年网站视频| 亚洲精品美女久久久久99| 无码国产精品一区二区免费式直播 | 老司机亚洲精品影院| 国产hs免费高清在线观看| 亚洲免费在线视频| 亚洲6080yy久久无码产自国产 | 国产在线观看免费视频软件|