2010-08-20 110 views
4

所以我今天就開始挖掘SSIS,所以如果有什麼明顯的東西丟失,不要太討厭。SSIS:從XML文件到多個表格

所以我有一個XML文件(來自第三方)

<root> 
    <foo> 
     <fooId>12345</fooId> 
     <name>FOO</name> 
     <bars> 
      <bar>BAR 1</bar> 
      <bar>BAR 2</bar> 
      [...] 
     </bars> 
    </foo> 
    [...] 
</root> 

和相應的表格中我的DB:
美孚與字段(FooID,名稱)
酒吧與場(BarID(身份PK ),FooID,Name)

所以基本上Bar就像是Foo的一組屬性。

因此,我添加一個指向該文件的XML源並生成3個不同的數據集(foobarsbarsbar)。問題是bar集合包含bar的值+一些自動生成的ID,這不是非常有用。我從這裏看到的barbarfooId的唯一方法是對這些集合進行排序和合並,這似乎很奇怪,可能會殘酷地殺害性能(我們在這裏談論數百K的foo)。

問題是:如何正確地做到這一點?

回答

1

我不擔心優化性能呢。只需添加另一個SSIS步驟即可轉換數據集。

當你有整個事情工作審查表現。 SSIS轉換比XSLT更容易維護。取決於您運行模塊的頻率,數百K的foo應該不是問題。我有一段時間沒有使用SSIS進行ETL,所以我不太喜歡這方面的速度,但是我使用的是XSLT,如果保持簡單,額外的SSIS步驟更容易維護。

只是我的意見。

1

我還沒有機會在SSIS中使用任何XML數據源。 BizTalk是我們在這裏選擇的工具。無論如何,我做了一些研究,在這裏發現了一個非常有用的文章:

http://blogs.msdn.com/b/mattm/archive/2007/12/11/using-xml-source.aspx

按照段上的處理,除了多個輸出執行以下操作:

  1. 與替換所有引用的元素你的元素
  2. 與你的元素替換其元件的所有引用

因此,基於THI s,請根據文章設置您的XML數據源。用高級屬性編輯器使用上面提到的potins修改它。將兩個輸出作爲條和條並將它們路由到合併連接。內部加入bars_Id。選擇bar和foo_Id作爲輸出列。這將能夠提供您的酒吧表。

我知道這是不理想的,因爲你正在排序和合並加入。希望通過在XML數據源中進行排序,它不會對性能產生很大的影響。

要考慮的另一個soltuion是使用XSLT文件來壓扁XML。這是通過控制流中的XML任務完成的。下面是可能會有所幫助,以及一篇文章:

http://blogs.msdn.com/b/mattm/archive/2007/12/15/xml-source-making-things-easier-with-xslt.aspx

祝您好運!

+0

這就是幾乎什麼,我現在在做什麼......我期待找到的只是一列從它的父元素添加到子元素的集合能力,因爲它已經被結構給出,但有似乎不是這樣做的簡單方法(或者我可能是盲目的) – 2010-08-23 18:11:05

+1

因此,我會嘗試使用XSLT方法。它會將XML模式扁平化,使XML數據源只有一個輸出。有點諷刺的是,我們使用XSLT使XML像平面文件一樣工作。 – 2010-08-24 03:14:51

1

@克里斯您的評論:有一個對象上添加一列一個簡單的方法。在數據流任務中添加一個步驟,使用「派生列」轉換步驟。在那裏,添加/操作你需要的列。

XSLT是一種痛苦。