使用Integration Service合并数据

Ari*_*ian 0 sql sql-server ssis etl business-intelligence

请考虑以下情况:

我的数据库中有一个表.我想使用SSIS在我的OLAP数据库中移动这些数据.我可以将所有记录从我的表移动到OLAP数据库.问题是我不知道如何在OLAP环境中应用更改.例如,如果我的表只有100条记录我改变了如何应用这些更改而不是从头开始复制所有记录.

我如何合并这两张桌子?

谢谢

Gar*_*thD 5

有两种主要方法:

  • 查找转换 - > OLE DB命令/ OLE DB目标
  • 将所有数据加载到临时表并使用SQL执行MERGE.

我的偏好是针对后者的,因为更新是基于SET的,但我确实使用前者,我知道它将主要是插入.

使用前者,您最终将得到一个数据流任务,例如:

在此输入图像描述

这是来自OLTP数据库的OLE DB源,然后查找您的OLAP数据库以检索代理键.如果没有匹配,则简单地将新记录插入到OLE DB目标中,当存在匹配时,它执行条件拆分,如果任何字段已更改,则将使用OLE DB命令更新OLAP表.

它显然比这复杂得多,但这涵盖了最简单的例子.

您还可以使用Slowly Changing Dimension Transformation打开向导来为您创建数据流,这又会变得更复杂:

在此输入图像描述

如上所述,我的Preference用于临时表和基于集的更新,因为OLE DB命令是逐行执行的,因此如果要更新数百万条记录,则需要很长时间.您只需在OLAP数据库上创建一个临时表,并使用简单的OLE DB源和目标移动数据,然后使用MERGE更新OLAP表:

MERGE OLAP o
USING Staging s
    ON o.BusinessKey = s.BusinessKey
    AND o.Type2SCD = s.Type2SCD     
    AND o.Active = 1
WHEN MATCHED AND o.Type1SCD != s.Type1SCD THEN 
    UPDATE
    SET Type1SCD = s.Type1SCD 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (BusinessKey, Type1SCD, Type2SCD, Active, EffectiveDate)
    VALUES (s.BusinessKey, s.Type1SCD, s.Type2SCD, 1, GETDATE())
WHEN NOT MATCHED BY SOURCE AND o.Active = 1 THEN 
    UPDATE
    SET Active = 0;
Run Code Online (Sandbox Code Playgroud)

以上假设每个业务密钥有一个活动记录,并且类型1和类型2都在缓慢改变维度,它将在BusinessKey和Type2SCD上没有匹配的情况下插入新记录,此外它将在源中设置任何不匹配的记录表无效.当匹配但类型1 SCD不同时,将更新.

值得注意的是MERGE有它的缺点,您可能希望将基于集合的upsert编写为单独的INSERT和UPDATE语句.我遇到的一个主要问题是,在我的所有Dimension表中,我在我的BusinessKey字段上有一个唯一的过滤索引,WHERE Active = 1以确保只有一个活动记录,我写的MERGE应该可以正常工作,但不详细说明这个连接项目.虽然不是世界末日必须添加OPTION (QUERYTRACEON 8790);到我的ETL中所有MERGE语句的末尾,但这并不理想.