![](/img/trans.png)
[英]How to use the master table as a lookup to populate the foreign key in the Reference table during SSIS data load
[英]SSIS ETL Transform-Load How To Handle Create / Update (i.e. UPSERT) for Foreign Key Table Data?
我将按照以下标准惯例在一组Office
, Employee
, Location
表上执行ETL:首先通过Extract包将所有数据放入Staging表中,然后对每个staging表执行Transform-Load以获取数据放入相应的表中。
在我的每个Transform-Load SSIS程序包中,我正在使用MERGE JOIN
和CONDITIONAL
拆分来执行CUD ( 创建,更新,删除 )。
当暂存表中的数据与对应的实际表为1对1时,这可以很好地工作。 在下面的场景中(参见图片), SampleLocation
表与SampleLocation
表是StageSampleLocation
。
我遇到的麻烦是决定如何处理暂存表中包含将要进入外键表的数据的情况。
如果您看下面的数据库图...
来自StageSampleOffice
的数据进入具有Office数据的字段的SampleOffice
中。 除了办公室数据之外, StageSampleOffice
还具有Person数据-在此示例中,将需要在FK表SamplePerson
查找OfficeManagerName
字段。 如果该名称在SamplePerson
表中不存在,则需要首先将该名称插入SamplePerson
,并且该人的PersonId
PK值将被检索并作为FK值存储在SampleOffice
表中导入的Office的SampleOffice
中,在我的数据流任务中。
同样,对于StageSampleOffice
的地址信息,需要在SampleLocation
FK表中查找详细信息,如果该地址不存在,则需要插入一个新地址,并带有StageSampleOffice
的相应值。 完成后,该地址的LocationId
将作为FK存储在SampleOffice
表中。
如您所见, SampleLocation
和SamplePerson
数据可能会从2个或更多来源进入系统。 在上面的示例中,对于SampleLocation
我得到一个仅具有地址的Location数据文件。 我还从StageSampleOffice
表中获得了来自各种办公类型的Office记录的地址,作为Office记录的一部分。
我已经将“ 提取”工作流与“转换-加载”工作流分开了。 我每个登台表都有1个提取包,该包实际上从源(平面文件或表)中读取数据,截断登台表,并将所有内容按原样导入到登台表中。
我在想
StageSampleOffice
存在的Person数据,我首先将数据插入StageSamplePerson
表(图中未显示),然后执行SamplePerson
的Transform-Load程序包,该程序将为这些Persons创建或更新 StageSampleOffice
存在的位置数据,我将首先将数据插入StageSampleLocation
表(图中未显示),然后对SampleLocation
执行Transform-Load程序包,该程序将为这些Location进行创建或更新。 这样,当流程返回到对SampleOffice
表执行Transform-Load的主程序包时,所有FK行都将出现在相应的表中。
这是一个好主意,还是有更好的方法。
谢谢!
在我看来就像“一个,六个,另一个的六个”。
无论哪种方式,您最终都要检查每个人和每个位置,以查看它是否已在最终目标表中,并进行插入。
无论您是否将它们“预压缩”在登台表中,工作负载都将是相同的。 我会采用对您来说似乎更直观的方法,因为这将是您将来会发现更易于维护的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.