OLE DB 命令允许您为发送的每一行运行任意命令。它会针对发送的每一行执行,如果您有大量行,可能会对性能产生影响。
更好的选择是第二个 OLE DB 目标。将所有需要更新的现有行(案例 2)填充到“暂存更改表”中。
在数据流之后,您将添加一个 Execute SQL Task,它对 case 2 的所有行执行数据的批量更新。
UPDATE T
SET Col1 = S.Col1 /*etc*/
FROM dbo.Target AS T
INNER JOIN dbo.Source as S
ON S.SurrogateKey = T.SurrogateKey;
在我看来你的包裹看起来像
OLE DB Source
|
Lookup PK Target
|
_____exists_______not exists____
| |
Lookup cols Target OLE DB Dest (Case 1)
|
__________________not exists____
|
OLE DB Dest (Case 2)
第一次查找是使用键测试是否存在。我们找不到的是 New Row。我们确实找到了什么,然后我们将再次查找,这次匹配我们关心的所有列(即插入日期可能只在数据库中,因此我们不关心它)。如果我们在第二次查找后仍然匹配,那么这些行存在并且相同,情况 3,所以我们什么都不做。更新是在第一次查找中存在但在第二次查找中不存在的行。
您正在寻找的是如何实现更新插入(插入/更新)模式。
当您向包含现有数据的表中添加数据时,您需要考虑 3 个条件:
Andy Leonard 有一个很棒的系列,The Stairway to Integration Services 但第 3 步和第 4 步可能正是您要找的
https://www.sqlservercentral.com/steps/adding-rows-in-incremental-loads-level-3-of-the-stairway-to-integration-services
OLE DB 目标组件仅处理插入,因此更新(或用您的术语替换)不是一个选项。
这给您留下了两个选择:OLE DB 命令或另一个 OLE DB 目标。
OLE DB 命令允许您为发送的每一行运行任意命令。它会针对发送的每一行执行,如果您有大量行,可能会对性能产生影响。
更好的选择是第二个 OLE DB 目标。将所有需要更新的现有行(案例 2)填充到“暂存更改表”中。
在数据流之后,您将添加一个 Execute SQL Task,它对 case 2 的所有行执行数据的批量更新。
在我看来你的包裹看起来像
第一次查找是使用键测试是否存在。我们找不到的是 New Row。我们确实找到了什么,然后我们将再次查找,这次匹配我们关心的所有列(即插入日期可能只在数据库中,因此我们不关心它)。如果我们在第二次查找后仍然匹配,那么这些行存在并且相同,情况 3,所以我们什么都不做。更新是在第一次查找中存在但在第二次查找中不存在的行。
我们可以做很多优化来简化这个,但对于菜鸟来说,这可能是最容易掌握的。