SSIS 批量導入遠程多級別的XML數據源。


看看我們SSIS的流程圖

 

大概的流程是這樣的:

先用執行SQL 任務,返回XML數據源的ResultSet, 再用Foreach容器,遍歷每個XML數據源,在數據流任務里實行,合並連接和排序等處理,最終插入到database。

 

詳細步驟

首先用儲存過程生成遠XML數據源的鏈接, 例:

http://www.abc.com/xml.php?p_checkin=18-Aug-12&p_checkout=18-Sep-12&p_hotel=BJJD

http://www.abc.com/xml.php?p_checkin=18-Aug-12&p_checkout=18-Sep-12&p_hotel=BDJD

http://www.abc.com/xml.php?p_checkin=18-Aug-12&p_checkout=18-Sep-12&p_hotel=SZXSW
....

例如看下圖的 Hotel_Rate

 

用瀏覽器打開,這些XML的返回結果一般是這樣的, 多級的。

<?xml version="1.0" encoding="UTF-8"?>
<QRATE>
  <XML_RESULT>
    <CONTRACTS>
      <CONTRACT>HC10000068</CONTRACT>
      <VER>26</VER>
      <HOTEL>BJJD</HOTEL>
      <HOTELNAME>北京酒店</HOTELNAME>
      <CUR>RMB</CUR>
      <PRODUCT>
        <PROD>15</PROD>
        <NATION>ALL</NATION>
        <NATIONNAME>全部國籍</NATIONNAME>
        <MIN>1</MIN>
        <MAX>99</MAX>
        <ADVANCE>0</ADVANCE>
        <TICKET>0</TICKET>
        <CANCEL>1</CANCEL>
        <CUTOFF>4</CUTOFF>
        <ROOM>
          <CAT>D3</CAT>
          <TYPE>D</TYPE>
          <SERV>10</SERV>
          <BF>2</BF>
          <DEADLINE>18-08-12</DEADLINE>
          <STAY>
            <STAYDATE>18-08-12</STAYDATE>
            <PRICE>650</PRICE>
            <ALLOT>5</ALLOT>
            <IS_ALLOT>N</IS_ALLOT>
          </STAY>
        </ROOM>
        <ROOM>
          <CAT>D3</CAT>
          <TYPE>S</TYPE>
          <SERV>10</SERV>
          <BF>1</BF>
          <DEADLINE>18-08-12</DEADLINE>
          <STAY>
            <STAYDATE>18-08-12</STAYDATE>
            <PRICE>650</PRICE>
            <ALLOT>5</ALLOT>
            <IS_ALLOT>N</IS_ALLOT>
          </STAY>
        </ROOM>
        <ROOM>
          <CAT>D3</CAT>
          <TYPE>T</TYPE>
          <SERV>10</SERV>
          <BF>2</BF>
          <DEADLINE>18-08-12</DEADLINE>
          <STAY>
            <STAYDATE>18-08-12</STAYDATE>
            <PRICE>650</PRICE>
            <ALLOT>5</ALLOT>
            <IS_ALLOT>N</IS_ALLOT>
          </STAY>
        </ROOM>
      </PRODUCT>
    </CONTRACTS>
    <RETURN_CODE>0</RETURN_CODE>
    <ERROR_MESSAGE/>
  </XML_RESULT>
</QRATE>

 

Sql 任務的屬性
(SQL 連接這里就不詳細解釋了)

SQLStatement 輸入XML數據源的表。

ResultSet 設為完整結果集

 

結果集那里新建的object類型 user::table

 

Foreach循環容器
集合的Enumerator 選擇為 Foreach ADO 枚舉器
ADO 對象源變量 選擇之前定義的 user::table變量

 
變量映射
新建二個變量contract和XML都為String類型的並定義它們的索引。

 

回過頭,再看看我們所定義變量



好了,主角來了, 下圖,是XML數據源的合並, 排序處理流程,最終寫入到sql server數據庫

 

要做到一步,我們設置一下XML源的高級屬性。
在輸入屬性和輸出屬性, XML_Result是根元素, 我們需要的子元素是 Contract, Product, Room, Stay 實現對應每個父元素和子元素
要把Contract, Product, Room, Stay的IsSorted屬性要設為True。


然后,我們找到 每子元素的對應ID並設置它們的SortKeyPosition的值。
Contract - Contract_ID = 1

Product - Contract_ID = 1
Product - Product_ID = 2

Room - Product_ID = 1
Room - Room_ID = 2

Stay - Room_ID = 1




數據訪問模式, 選擇來自變量的XML文件, 選擇之有定義好的user::xml, XSD位置 選擇生成好的xsd文件。
可以在 數據訪問模式 選擇XML文件位置 輸入某個XML源文件來生成xsd。
例:http://www.abc.com/xml.php?p_checkin=18-Aug-12&p_checkout=18-Sep-12&p_hotel=BJJD
在列那里,把相應的列表對應好。

 

我們先合並Contract和Product元素, 聯接類型 以Contract為准,我這里設定是左外部聯接。
在這里個圖,我們可以看到 聯接鍵是 contract_id, 這是我們之前設置XML源的IsSorted和contract_id的SortKeyPosition為1 到來的結果。
在contract里邊還有一個product_id 鈎選為輸出列,為下一步與product元素合並使用。

 

在進行Product和Room合並之前,我們要把Product_id重新排序為1。就是這樣以此類推設置room_id。

大概的流程是:
把contract和product合並, 排序product_id,  
再把contract和product結合體和room合並, 排序room_id,
最后把 contract, product, room的結合體與stay合並並入寫數據庫。

排序product_id


排序room_id

 

大工告成,開始執行

 

導入ing


再看看我們的寫入的表, OK, done.


注:請把全局和數據流任務的MaximumErrorCount調大一點,這樣發生錯誤之后,會繼續執行任務


如果您覺我得寫的不錯或者對您有幫助, 請推薦一下吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM