在多个表中插入行,并分别维护关系

时间:2012-07-13 12:00:47

标签: sql sql-server-2008 ssis

尝试使用SSIS将特定场景中的数据从excel表插入4个表中,我有点失落。

我的Excel工作表的每一行都需要分成3个表。然后需要将标识列值插入第4个映射表以保存关系。如何使用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的方法,我也没问题,因为我没有任何使用SSIS的任务。另外的挑战是,在表2中,如果存在相同的数据行,我想在映射表中使用该ID,而不是插入重复的行!

1 个答案:

答案 0 :(得分:3)

多播是您正在寻找的组件。该组件接受输入源并将其输出为DUPLICATE。在这种情况下,您可以使用Excel源并复制流以将数据插入Table1,Table2和Table3。

现在,棘手的部分是将这些身份恢复到Map_Table中。要么您不使用IDENTITY并使用其他方法(如GUID,或您自己的增量计数器,您将在多播之前设置为派生列),或者使用@@IDENTITY来检索最后插入的标识。对你来说,使用@@IDENTITY对我来说听起来很痛苦,但这取决于你。如果数据不是很大,我会选择GUID。

@@IDENTITY与BULK操作不兼容。它将仅检索创建的最后一个标识。另外,请记住我谈过@@ IDENTITY,但您可能希望使用IDENT_CURRENT('TableName')来检索特定表的最后一个标识。 @@IDENTITY检索会话中创建的最后一个标识,无论范围如何。您可以使用SCOPE_IDENTITY()来检索范围内的最后一个身份。