2012-07-13 88 views
3

我有點遺失,試圖使用SSIS將我的數據從Excel表格插入到4個表格中。在多個表格中插入一行,並單獨維護一個關係

我的excel表格的每一行都需要分成3個表格。然後需要將標識列值插入到第四映射表中以保存關係。我如何通過SSIS 2008高效地實現這一目標?

請注意在下面的例子中,它固定col4和5都進入第3表。

這裏是數據例如

的Excel

col1 col2 col3 col4 col5 
a  b  c  d  3 
a  x  c  y  5 

表1

PK col 
1 a 
2 a 

表2

PK col1 col2 
1  b  c 
2  x  c 

表3

PK Col 
1 d 
2 3 
3 y 
4 5 

Map_table

PK Table1_ID Table2_ID Table3_ID 
1 1   1   1 
2 1   1   2 
2 2   2   3 
2 2   2   4 

我哪怕只是一個基於SQL的方法建議,因爲我不AVE任何任務只使用SSIS罰款。額外的挑戰是,在表2中,如果存在相同的數據行,我想在映射表中使用該ID,而不是插入重複的行!

+1

你真的需要基於SSIS的解決方案嗎?看着這個,我感覺到在將源Excel導入數據庫之後,使用SQL腳本可以更輕鬆地解決這個問題。 – Josien 2012-07-13 13:21:06

+1

@Josien一切都可以用SQL腳本來實現,但是SSIS是一個很好的方式來概括你的數據流......他要求一些可以用SQL解決的問題,但也許這個包是更大局面的一部分。 – 2012-07-13 13:24:22

+0

@Dominic Goulet:好點! – Josien 2012-07-13 13:31:41

回答

3

多播是您正在尋找的組件。該組件獲取輸入源並將其重複輸出。在這種情況下,您可以使用Excel來源並複製流程以將數據插入到Table1,Table2和Table3中。

現在,棘手的部分是將這些身份取回到您的Map_Table中。要麼不使用IDENTITY,要麼使用其他方法(如GUID或自己的增量計數器,您可以在多播之前將其設置爲派生列),或者使用@@IDENTITY來檢索上次插入的標識。使用@@IDENTITY對於您當前的情況聽起來像是一種痛苦,但這取決於您。如果數據不是那麼龐大,我會去找一個GUID。

@@IDENTITY在BULK操作中效果不佳。它將只檢索最後創建的標識。另外請記住,我談到@@ IDENTITY,但您可能想使用IDENT_CURRENT('TableName')來檢索特定表的最後一個標識。 @@IDENTITY檢索會話中創建的最後一個身份,無論範圍如何。您可以使用SCOPE_IDENTITY()來檢索範圍內的最後一個身份。

+0

我很高興被證明是錯誤的,但在SSIS中使用標準OLE目標不允許您獲取@@標識值(您也不能使用帶有SQL腳本目標的OLE嘗試使用OUTPUT子句)。可惜,它會很方便。 – billinkc 2012-07-13 14:38:15

+0

您可以使用OLEDB命令和存儲過程來插入並返回@@標識 - 只需要更多的工作;-) – 2012-07-13 14:45:07

+0

是的,OLEDB命令可以工作,但這不是OLE目標。另外,OLEDB命令提供*糟糕的性能,因爲它會在每行中發佈一條語句**。 – billinkc 2012-07-13 16:29:53

相關問題