在SSIS包中,如何插入主 - 详细记录?

时间:2009-03-27 17:42:55

标签: ssis insert identity master-detail

我有一个数据流任务,它从一个数据库中提取数据并插入到SQL Server数据库中。在主行中插入每条记录后,我还需要在详细信息表中插入行。详细信息表的数据非常简单,可以计算。

  1. 如何在插入后检索标识列的值?
  2. 如何生成必须插入第二个表中的行?我可以在脚本中执行此操作吗?
  3. 我是否需要在控制流级别使用Foreach循环来传输数据流任务中的父行,然后使用另一个插入详细记录的Foreach循环?

    我可以在脚本中执行所有细节行插入吗?这可能比放入Foreach循环更容易。

3 个答案:

答案 0 :(得分:3)

这是一种方法..

创建一个object类型的变量。

创建一个“执行SQL任务”,它可以获取源数据并将其加载到变量中(ADO.NET)。

创建一个“ForEach循环容器。

将Success连接器(绿色)从“Execute SQL Task”拖到“ForEach Loop Container”。将循环容器上的Enumerator更改为“foreach ADO Enumerator”并从“ADO对象源变量”中选择变量。

在你的循环中,你应该能够添加一个你可以使用的“执行SQL任务”..

您应该能够在插入主表后使用SCOPE_IDENTITY()获取每个ID,并使用它插入详细信息表。

答案 1 :(得分:2)

我有一个更大规模的问题(导入深度嵌套的XML)。我能够利用XML Source的一个功能,在主“表”中创建一个代理键,然后在“子”表中作为“外键”重复。

这个想法是允许每个“表”到达数据库中的单独的临时表。处理完所有行后,您可以使用这些“外键”进行任何需要同时创建主行和详细行的最终处理 - 即使在必要时也可以在事务中进行。

这样可以实现数据流任务的性能,并结合数据的主从属性。

答案 2 :(得分:0)

我在迁移源中具有ID字段的数据时经常使用的一种技术是使用名为" OldID"的列。在目标主表中。使用SSIS控件填充它,将原始id字段放入OldID。然后是后续的SSIS控件对已经填充的主记录执行查找,其中OldID与源ID匹配,并以此方式获取新创建的ID。