SSIS:更新或插入后删除行

时间:2013-03-29 10:55:45

标签: sql-server etl ssis

以下是以下情况: 我有一个 StudentsA 表,需要与另一个表同步,在另一台服务器上, StudentsB 。这是从A到B的单向同步。 由于StudentsA表可以容纳大量行,因此我们有一个名为 StudentsSync 的表(在输入服务器上),其中包含自上次修改后的 StudentsA ID从 StudentsA 复制到 StudentsB

我做了以下SSIS数据流任务:

enter image description here

唯一的问题是我需要在成功复制或更新后从 StudentsSync 删除行。像这样:

enter image description here

知道如何实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

可以使用3种方法实现

1.如果target中的OutputDB表格包含TimeStampCreatemodified TimeStamp个列,则表示行updated或可以通过编写简单查询来获取inserted。您需要在execte sql task Control Flow中的delete中向Sync表中的Delete from SyncTable where keyColumn in (Select primary_key from target where ModifiedTimeStamp >= GETDATE() or (ModifiedTimeStamp is null and CreateTimeStamp>=GETDATE())) 行写下以下查询。

StudentsA's

我认为primary key表中存在Sync primary key以及Target表的new row。上述条件基本上会检查,如果addedCreateTimeStamp,则current列的日期为modifiedTimeStampnullupdated,否则值为modifiedTimeStamp,则TimeStamp将具有当前日期

如果您的target表格中有Data Warehouse个列,如果您将数据加载到MERGE

,我觉得应该在那里

2.您可以使用Control Flow语法执行更新,并使用Execute SQL TaskData Flow Task中插入。无需使用TimeStamp columns。以下查询甚至可以使用如果您没有DECLARE @Output TABLE ( ActionType VARCHAR(20), SourcePrimaryKey INT) MERGE StudentsB AS TARGET USING StudentsA AS SOURCE ON (TARGET.CommonColumn = SOURCE.CommonColumn) WHEN MATCHED THEN UPDATE SET TARGET.column = SOURCE.Column,TARGET.ModifiedTimeStamp=GETDATE() WHEN NOT MATCHED BY TARGET THEN INSERT (col1,col2,Col3) VALUES (SOURCE.col1, SOURCE.col2, SOURCE.Col3) OUTPUT $action, INSERTED.PrimaryKey AS SourcePrimaryKey INTO @Output Delete from SyncTable where PrimaryKey in (Select SourcePrimaryKey from @Output where ActionType ='INSERT' or ActionType='UPDATE')

MERGE

代码没有经过测试,因为我已经没时间了。但至少它应该让你知道如何继续。 。有关Multicast语法的详细信息,请阅读thisthis

3.将duplicate组件用于Insert UpdateMULTICAST的数据集。将lookmatch连接到Lookup No match output输出和另一个多播到{{1}}

enter image description here

答案 1 :(得分:0)

  1. 在“更新现有条目”之后和“插入新条目”之后添加任务,将学生ID添加到包含要删除的ID列表的变量中。
  2. 将所有任务包含在序列容器中。
  3. 在序列容器执行后添加一个任务,以删除同步表中您已填充的变量中的所有记录。