亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL Server 中用While循環替代游標(Cursor的解

系統 3023 0

  在編寫SQL批處理或存儲過程代碼的過程中,經常會碰到有些業務邏輯的處理,需要對滿足條件的數據記錄逐行進行處理,這個時候,大家首先想到的方案大部分是用“游標”進行處理。

  舉個例子,在訂單管理系統中,客服需要對訂單日期為2012-09-01的銷售訂單進行某個批量操作,比如批量發貨操作,后臺業務邏輯處理時,需要對滿足條件的訂單記錄進行逐行處理。

  我首先是采用“游標”編寫的業務邏輯存儲過程,SQL代碼可以如下:

游標
        
           1
        
        
          DECLARE
        
        
          @ORDERID
        
        
          VARCHAR
        
        (
        
          30
        
        
          )


        
        
           2
        
        
           3
        
        
          --
        
        
              聲明局部游標:從訂單數據表獲取訂單日期為2012-09-01,訂單類型為Sales的訂單編號
        
        
           4
        
        
          DECLARE
        
         CURSOR_ORDER 
        
          CURSOR
        
         LOCAL 
        
          FOR
        
        
           5
        
        
          SELECT
        
         ORDERID 
        
          FROM
        
         ORDERHD H 
        
          WHERE
        
         ORDERDATE 
        
          =
        
        
          '
        
        
          2012-09-01
        
        
          '
        
        
          AND
        
         H.ORDERTYPE 
        
          =
        
        
          '
        
        
          Sales
        
        
          '
        
        
           6
        
        
           7
        
        
          --
        
        
              打開游標
        
        
           8
        
        
          OPEN
        
        
           CURSOR_ORDER


        
        
           9
        
        
          FETCH
        
        
          NEXT
        
        
          FROM
        
         CURSOR_ORDER 
        
          INTO
        
        
          @ORDERID
        
        
          10
        
        
          WHILE
        
        
          @@FETCH_STATUS
        
        
          =
        
        
          0
        
        
          11
        
        
          BEGIN
        
        
          12
        
        
          13
        
        
          /*
        
        
          14
        
        
              此處編寫對當前行數據的業務邏輯處理代碼


        
        
          15
        
        
          */
        
        
          16
        
        
          17
        
        
          --
        
        
              得到下一條記錄
        
        
          18
        
        
          FETCH
        
        
          NEXT
        
        
          FROM
        
         CURSOR_ORDER 
        
          INTO
        
        
          @ORDERID
        
        
          19
        
        
          END
        
        
          20
        
        
          21
        
        
          --
        
        
              關閉游標
        
        
          22
        
        
          CLOSE
        
        
           CURSOR_ORDER  


        
        
          23
        
        
          --
        
        
              釋放游標
        
        
          24
        
        
          DEALLOCATE
        
         CURSOR_ORDER
      

?

?  功能是實現了,但是客服在實際使用過程中,經常反饋批量操作效率太慢,需要等待較長時間才能完成操作。經過測試發現,速度慢在游標逐行處理過程中,當需要處理的記錄數較大,而且游標處理位于數據庫事務內時,速度非常慢。

  那么,有什么方法可以解決這個處理速度慢的問題嗎?

  經不斷的嘗試,終于找到一個方法,那就是用 WHILE循環 來進行逐行數據處理。首先將需要處理的數據記錄獲取到一個臨時表(此臨時表包括2個重要字段:REFID - 記錄行號,DealFlg:行處理標識,用1/0標識行是否已處理),然后WHILE循環對臨時表進行逐行處理,SQL代碼如下:

While 循環
        
           1
        
        
          DECLARE
        
        
          @REFID
        
        
          INT
        
        
           2
        
                 , 
        
          @ORDERID
        
        
          VARCHAR
        
        (
        
          30
        
        
          )


        
        
           3
        
        
           4
        
        
          --
        
        
              獲取待處理的數據記錄到臨時表
        
        
           5
        
        
          --
        
        
              字段說明:REFID:記錄行號 / DealFlg:行處理標識
        
        
           6
        
        
          SELECT
        
          REFID 
        
          =
        
        
          IDENTITY
        
        (
        
          INT
        
         , 
        
          1
        
        , 
        
          1
        
        ), DealFlg 
        
          =
        
        
          0
        
        
          , ORDERID


        
        
           7
        
        
          INTO
        
        
           #Temp_Lists


        
        
           8
        
        
          FROM
        
        
           ORDERHD


        
        
           9
        
        
          WHERE
        
         ORDERDATE 
        
          =
        
        
          '
        
        
          2012-09-01
        
        
          '
        
        
          AND
        
         H.ORDERTYPE 
        
          =
        
        
          '
        
        
          Sales
        
        
          '
        
        
          10
        
        
          11
        
        
          --
        
        
              獲取臨時表數據的最小行號
        
        
          12
        
        
          SELECT
        
        
          @REFID
        
        
          =
        
        
          MIN
        
        (REFID) 
        
          FROM
        
         #Temp_Lists 
        
          WHERE
        
         DealFlg 
        
          =
        
        
          0
        
        
          13
        
        
          14
        
        
          --
        
        
              若最小行號不為空(有需要處理的數據)
        
        
          15
        
        
          WHILE
        
        
          @REFID
        
        
          IS
        
        
          NOT
        
        
          NULL
        
        
          16
        
        
          BEGIN
        
        
          17
        
        
          18
        
        
          --
        
        
              獲取當前處理行的信息
        
        
          19
        
        
          SELECT
        
        
          @ORDERID
        
        
          =
        
         ORDERID 
        
          FROM
        
          #Temp_Lists 
        
          WHERE
        
         REFID 
        
          =
        
        
          @REFID
        
        
          20
        
        
          21
        
        
          /*
        
        
          22
        
        
              此處編寫對當前行數據的業務邏輯處理代碼        


        
        
          23
        
        
          */
        
        
          24
        
        
          25
        
        
          --
        
        
              標識當前行已處理完畢
        
        
          26
        
        
          UPDATE
        
         #Temp_Lists 
        
          SET
        
         DealFlg 
        
          =
        
        
          1
        
        
          WHERE
        
         REFID 
        
          =
        
        
          @REFID
        
        
          27
        
        
          28
        
        
          --
        
        
              選擇下一行號
        
        
          29
        
        
          SELECT
        
        
          @REFID
        
        
          =
        
        
          MIN
        
        (REFID) 
        
          FROM
        
         #Temp_Lists 
        
          WHERE
        
         DealFlg 
        
          =
        
        
          0
        
        
          AND
        
         REFID 
        
          >
        
        
          @REFID
        
        
          30
        
        
          31
        
        
          END
        
      

?  經過這樣對原存儲過程進行修正后,批量操作速度得到顯著提升。

  有興趣的朋友,可以嘗試使用這個方法替代游標,對比2種方案的處理效率。

?

SQL Server 中用While循環替代游標(Cursor的解決方案


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费精品久久久久久中文字幕 | 奇米成人网 | 日本精品一区二区三本中文 | 欧做爰xxxⅹ性欧美大片孕妇 | 国产伦精品一区二区三区视频小说 | 橘梨纱视频一区二区在线观看 | 欧美一级毛片一免费 | 亚洲国产精品综合久久2007 | 日韩 综合| 爱爱小视频免费体验区在线观看 | 视频二区中文字幕 | 四虎网站| 大片在线播放日本一级毛片 | 精品免费国产一区二区三区 | 欧美日韩在线成人免费 | 亚洲人xxx日本人18 | 成 人 黄 片 大全 | 日本中文在线三级在线播放 | 成年黄页免费大全网站 | 亚洲精品色一区二区三区 | 日韩欧美网址 | 日批日韩在线观看 | 天天靠天天擦天天摸 | 日韩一区二区三区精品 | 五月天丁香婷婷综合 | 激情五月宗合网 | 大香伊人久久 | 韩国成人毛片aaa黄 韩国高清不卡一区二区 | 亚洲国产欧美自拍 | 97理论片 | 久久美剧免费在线观看 | 99久久精品费精品国产一区二 | 精品亚洲欧美中文字幕在线看 | 天天爽爽 | 一级aa免费视频毛片 | 精品无人区乱码一区2区3区 | 奇米激情网 | 99久久99这里只有免费的精品 | 韩国欧美一级毛片免费 | 欧美一级艳片爽快片 | 日本免费中文字幕在线看 |