【问题标题】:Inserting a row in multiple tables, and maintaining a relationship separately在多个表中插入一行,并分别维护一个关系
【发布时间】:2012-07-17 01:23:12
【问题描述】:

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

我的 Excel 表的每一行都需要分成 3 个表格。然后需要将标识列值插入到第 4 个映射表中以保存关系。如何使用 SSIS 2008 有效地实现这一目标?

请注意,在下面的示例中,它固定 col4 和 5 进入第三个表。

这是数据示例

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

Table3

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,而不是插入重复的行!

【问题讨论】:

  • 您真的需要基于 SSIS 的解决方案吗?看到这里,我觉得在将源 Excel 导入数据库后,使用 SQL 脚本可以更轻松地解决它。
  • @Josien 一切都可以用 SQL 脚本来实现,但是 SSIS 是一个很好的方式来了解你的数据流......他要求可以用 SQL 解决的东西,但也许这个包是更大图景的一部分。
  • 不,SSIS 不是强制性的要求。我只需要一种可重复的方式将 excel 数据导入这些表中。我想也许 SSIS 会更好地满足这一需求。
  • 我认为 Josien 的想法是正确的。 SSIS 可能非常有用,但我建议您按原样导入 Excel 文件,然后使用 sproc 剥离组件并在需要的地方插入它们。如果要成为更大流程的一部分,您可以将这两个步骤放在 SSIS 中。

标签: sql sql-server-2008 ssis


【解决方案1】:

多播是您正在寻找的组件。该组件接受一个输入源并将其复制到尽可能多的输出中。在这种情况下,您可以拥有 Excel 源并复制流程以将数据插入到表 1、表 2 和表 3 中。

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

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

【讨论】:

  • 我很高兴被证明是错误的,但是在 SSIS 中使用标准 OLE 目标不允许您获取 @@identity 值(也不能尝试将 OLE 与 SQL 脚本目标一起使用使用 OUTPUT 子句)。可惜,它会很方便。
  • 您可以使用 OLEDB 命令和存储过程来插入和返回 @@identity -- 只是多做一点工作 ;-)
  • 是的,OLEDB 命令可以工作,但这不是 OLE 目标。此外,OLEDB 命令提供 horrible 性能,因为它会发出 per 行语句。
  • 您不能将@@IDENTITY 与批量操作一起使用。这就是为什么我建议 OP 自己生成 ID,我应该在我的答案中指定它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2014-05-22
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2012-07-10
相关资源
最近更新 更多