SSIS ETL转换 - 加载如何处理外键表数据的创建/更新(即UPSERT)?

时间:2015-12-30 22:21:21

标签: sql-server architecture ssis etl ssis-2012

我在一组OfficeEmployeeLocation表上执行ETL,遵循将所有数据引入临时表的标准做法,首先通过提取包,然后在每个临时表上执行转换加载,以将数据放入相应的表中。

在我的每个转换加载 SSIS包中,我使用{{1执行 CUD 创建,更新,删除) }和MERGE JOIN拆分。

当Staging表中的数据与相应的真实表一起 1对1 时,此方法可以正常工作。在下面的场景中(见图),CONDITIONAL表与SampleLocation表一对一。

我遇到的麻烦是决定如何处理Staging表中有数据进入外键表的情况。

问题解释

如果您查看以下数据库图表......

enter image description here

来自StageSampleLocation的数据会转到StageSampleOffice,用于包含Office数据的字段。除办公室数据外,SampleOffice还有人员数据 - 在此示例中,需要在FK表StageSampleOffice中查找OfficeManagerName字段。如果SamplePerson表中不存在该名称,则需要首先在SamplePerson中插入此名称,并检索该人员的SamplePerson PK值并将其存储为FK我的数据流任务中PersonId表中导入的Office行的值。

同样,对于SampleOffice中的地址信息,需要在StageSampleOffice FK表中查找详细信息,如果地址不存在,则需要插入新地址使用SampleLocation中的相应值。完成后,地址的StageSampleOffice将作为FK存储在LocationId表中。

如您所见,SampleOfficeSampleLocation的数据可能会从2个或更多来源进入系统。在上面的示例中,对于SamplePerson,我得到一个只有地址的位置数据文件。我还从SampleLocation表格中获取来自各种办公类型的Office记录的一部分地址。

到目前为止我尝试了什么

我已将 Extract 工作流与Transform-Load工作流分开。我在每个临时表中有1个解压缩包,它基本上从源(flatfile或表)读取数据,截断登台表,并将所有内容按原样导入到临时表中。

我在想

  • 对于StageSampleOffice中存在的Person数据,我将首先将数据插入StageSampleOffice表(图中未显示),然后执行 Transform-Load StageSamplePerson的包,用于为这些人创建或更新
  • 对于SamplePerson中存在的位置数据,我将首先将数据插入StageSampleOffice表(图中未显示),然后执行 Transform-Load StageSampleLocation的包,用于创建或更新这些位置。

这样,当流返回到执行SampleLocation表的Transform-Load的主包时,所有FK行都将出现在相应的表中。

这是一个好主意,还是有更好的方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

对我来说,似乎是“六分之一,六分之一”。

无论哪种方式,您最终都会检查每个人和每个位置,看看它是否已经在最终目的地表中并进行插入。

您是否在临时表中“预压缩”它们,或者工作负载是否相同。我会采用对您来说更直观的方法,因为这将是您将来发现更易于维护的方法。