SSIS 使用日期时间列获取最新记录
SSIS Getting the most up to date record using datetime columns
我正在为 SQL Server 2014 包构建一个 SSIS,目前正在尝试使用两个来源之间的日期时间列从两个不同的来源获取最新记录,并实施一种方法来实现这一点。到目前为止,我在 thirdpartyid 上使用 Lookup Task 来匹配我最终需要比较的记录,并使用 Merge Join 将它们组合在一起并最终拥有一个具有最新 record.I 的暂存 table先前的数据任务(未显示)已将不在 AD1 中的记录插入暂存 table,因此此时这些记录是一对一匹配的。这两个来源看起来像这样,具有完全相同的日期时间列,只是日期不同,并且一些信息具有空值,因为没有它的历史记录。
示例输出
这是我目前的数据流任务。我真的是 SSIS 的新手,所以任何想法或建议将不胜感激。
鉴于您的两个来源之间存在 1:1 匹配,我会将其构建为来源 (V1) -> 查找 (AD1)
根据 thirdpartyid
定义查找并检索所有 AD1 列。您最终可能会得到类似 name
和 name_ad1
等
的数据流
然后我会添加一个派生列来标识日期是否不同(假设在那种情况下,您需要采取行动)
IsNull(LastUpdated_AD1) || LastUpdated > LastUpdated_AD1
如果 AD1 中的列为空或者 V1 最后更新的列大于 AD1 版本,则该表达式将创建一个布尔值。
然后您可能会在数据流中添加一个条件拆分,并将其基于我们新列的值,然后将更改的数据路由到您的机制中以处理更新(OLE DB 命令或最好是 OLE DB目标 + 执行 SQL 任务 post 数据流以执行批量更新)
评论问
should it all be one expression? like IsNull(AssignmentLastUpdated_AD1) || AssignmentLastUpdated > AssignmentLastUpdated_AD1 || IsNull(RoomLastUpdated_AD1) || RoomLastUpdated > RoomLastUpdated_AD1
你 可以 那样做,但是当你得到一个奇怪的结果并且有人问你如何得到那个值时,长表达式使得调试变得困难。我可能在数据流中有两个派生列组件。第一个将为每组条件创建一个已更改的列
HasChangedAssignment
(IsNull(AssignmentLastUpdated_AD1) || AssignmentLastUpdated > AssignmentLastUpdated_AD1)
HasChangedRoom
IsNull(RoomLastUpdated_AD1) || RoomLastUpdated > RoomLastUpdated_AD1
等等
然后在最终派生列中创建 HasChanged 列
HasChangedAssignment || HasChangedRoom || HasChangedAdNauseum
使用像这样基于模式的方法可以更轻松地构建、排除故障 and/or 或进行可能对包的正确性、可维护性和性能产生重大影响的小更改。
我正在为 SQL Server 2014 包构建一个 SSIS,目前正在尝试使用两个来源之间的日期时间列从两个不同的来源获取最新记录,并实施一种方法来实现这一点。到目前为止,我在 thirdpartyid 上使用 Lookup Task 来匹配我最终需要比较的记录,并使用 Merge Join 将它们组合在一起并最终拥有一个具有最新 record.I 的暂存 table先前的数据任务(未显示)已将不在 AD1 中的记录插入暂存 table,因此此时这些记录是一对一匹配的。这两个来源看起来像这样,具有完全相同的日期时间列,只是日期不同,并且一些信息具有空值,因为没有它的历史记录。
示例输出
这是我目前的数据流任务
鉴于您的两个来源之间存在 1:1 匹配,我会将其构建为来源 (V1) -> 查找 (AD1)
根据 thirdpartyid
定义查找并检索所有 AD1 列。您最终可能会得到类似 name
和 name_ad1
等
然后我会添加一个派生列来标识日期是否不同(假设在那种情况下,您需要采取行动)
IsNull(LastUpdated_AD1) || LastUpdated > LastUpdated_AD1
如果 AD1 中的列为空或者 V1 最后更新的列大于 AD1 版本,则该表达式将创建一个布尔值。
然后您可能会在数据流中添加一个条件拆分,并将其基于我们新列的值,然后将更改的数据路由到您的机制中以处理更新(OLE DB 命令或最好是 OLE DB目标 + 执行 SQL 任务 post 数据流以执行批量更新)
评论问
should it all be one expression? like
IsNull(AssignmentLastUpdated_AD1) || AssignmentLastUpdated > AssignmentLastUpdated_AD1 || IsNull(RoomLastUpdated_AD1) || RoomLastUpdated > RoomLastUpdated_AD1
你 可以 那样做,但是当你得到一个奇怪的结果并且有人问你如何得到那个值时,长表达式使得调试变得困难。我可能在数据流中有两个派生列组件。第一个将为每组条件创建一个已更改的列
HasChangedAssignment
(IsNull(AssignmentLastUpdated_AD1) || AssignmentLastUpdated > AssignmentLastUpdated_AD1)
HasChangedRoom
IsNull(RoomLastUpdated_AD1) || RoomLastUpdated > RoomLastUpdated_AD1
等等
然后在最终派生列中创建 HasChanged 列
HasChangedAssignment || HasChangedRoom || HasChangedAdNauseum
使用像这样基于模式的方法可以更轻松地构建、排除故障 and/or 或进行可能对包的正确性、可维护性和性能产生重大影响的小更改。