更新目标 table 给定源 table 中的 DateCreated 和 DateUpdated 列

update target table given DateCreated and DateUpdated columns in source table

考虑到源 table 包含 DateTimeCreated 和 DateTimeUpdated 列,更新目标 table 的最有效方法是什么?

I would like to keep the source in target in synch avoiding a truncate. I am looking for a bets practice pattern in this situation

我会避免最佳实践答案,但会提供足够的细节以做出适当的选择。您可以使用两种主要方法在 SSIS 中更新 table,避免 TRUNCATE - LOAD:

1) 使用 OLEBD COMMAND

如果满足以下条件,则此方法很好:

  • 你有一个可靠的 DateTimeUpdated 列,
  • 要更新的行不多,
  • 要更新的列不多
  • 数据流中添加的列不多(即派生列转换)
  • 并且更新语句相当简单。

此方法对许多列执行不佳,因为它执行逐行更新。依靠审计日期列可能是减少要更新的行数的好方法,但如果在源系统中更新行而审计列未更改,它也会导致问题。我建议仅在它具有触发器时才信任它,否则您可以确定没有人可以在 table.

上执行更新

此外,当有大量列要映射或数据流中正在进行大量转换时,此组件会失效。例如,如果您将所有字符串列从 unicode 转换为非 unicode,您可能会混合使用许多额外的列,这会使映射和维护变得很痛苦。该组件中的映射工具适用于大约 10 列,之后很快就会变得混乱。特别是因为您要映射到编号参数而不是列名。

最后,如果您在更新语句中做任何复杂的事情,它更适合 SQL 代码,而不是在没有智能感知且通常使用起来很痛苦的组件编辑器中维护它。

2) 暂存数据并在数据流

之后的Execute SQL任务中进行更新

出于 OLEDB 命令的所有不利原因,此方法是好的,但也有一些缺点。还有更多代码需要维护:

  • 几个 t-sql 任务,
  • 一个过程
  • 和分期table

这也意味着设置也需要更多时间。但是,它确实执行得非常好,并且代码更容易阅读和理解。日常维护也更简单。

请参阅我今天碰巧回答的关于同一主题的另一个问题的笔记: