看看我們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調大一點,這樣發生錯誤之后,會繼續執行任務
如果您覺我得寫的不錯或者對您有幫助, 請推薦一下吧。