2012-07-13 86 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

相关问题