SSIS:更新或插入后删除行(SSIS : delete rows after an update

2019-08-18 05:53发布

这里是以下情况:我有学员对于一个表,需要与另一个表同步,不同的服务器,StudentsB上。 这是从一个单向同步到B.由于该表学员对于可以容纳大量的行,我们有一个名为StudentsSync(输入服务器上),包含自从学员对于最后的副本已修改的学员对于的ID表到StudentsB。

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

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

任何想法如何可以做到这一点?

Answer 1:

它可以使用3种方法来实现

1.如果你的targetOutputDB具有TimeStamp列,比如Createmodified TimeStamp然后已经得到行updatedinserted可以通过编写一个简单的查询得到。 你需要写在下面的查询execte sql taskControl 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 keyTarget表。 在上述条件基本检查,如果new rowadded然后CreateTimeStamp列将有current的日期和modifiedTimeStamp将是null否则如果值updated那么modifiedTimeStamp将当前日期

如果你有以上的查询将工作TimeStamp列中的target表,我觉得,如果应该有你的数据加载到Data Warehouse

2.You可以用MERGE语法来执行更新和插入Control FlowExecute SQL Task 。没有需要使用Data Flow Task .The下面的查询可以使用,即使你没有任何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')

因为我的时间不多了。但在,至少它应该给你一个公平的想法如何进行代码没有进行测试。 。对于在furthur详细MERGE语法,阅读这和这

3.使用Multicast组件,以duplicate的数据集InsertUpdate .Connect一个MULTICASTlookmatch输出和另一个多播Lookup No match output



Answer 2:

  1. 添加任务“更新现有项目”后和“插入新项目”到学生ID添加到其中将包含的ID删除列表中的变量。
  2. 附上所有的任务序列中的容器。
  3. 序列容器执行后添加一个任务来删除同步表是该变量你已经填充的所有记录。


文章来源: SSIS : delete rows after an update or insert