Sql server SSIS:更新或插入后删除行

Sql server SSIS:更新或插入后删除行,sql-server,etl,ssis,Sql Server,Etl,Ssis,情况如下: 我有一个StudentsA表,需要与另一个表同步,该表位于不同的服务器StudentsB上。这是从a到B的单向同步。 由于StudentsA表可以容纳大量行,因此我们有一个名为StudentsSync(在输入服务器上)的表,其中包含StudentsA的ID,该ID自上次从StudentsA复制到StudentsB后已被修改 我执行了以下SSIS数据流任务: 唯一的问题是,在成功复制或更新后,我需要从StudentsSync中删除该行。大概是这样的: 你知道如何做到这一点吗 在“更

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

我执行了以下SSIS数据流任务:

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

你知道如何做到这一点吗

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

  • 它可以通过3种方法实现

    1.如果
    OutputDB
    中的
    target
    表具有
    TimeStamp
    列,例如
    Create
    modified TimeStamp
    ,则可以通过编写一个简单的查询来获得已更新的
    或插入的
    行。您需要在
    控制流
    中的
    执行sql任务
    中将以下查询写入
    删除
    同步
    表中的那些行

    Delete from SyncTable
    where keyColumn in (Select primary_key from target 
    where ModifiedTimeStamp >= GETDATE() or (ModifiedTimeStamp is null
    and CreateTimeStamp>=GETDATE()))
    
    我假设
    StudentsA的
    主键
    目标
    表的
    主键
    一起出现在
    同步
    表中。上述条件基本检查,如果添加了
    新行
    创建时间戳
    列将具有
    当前
    日期,
    修改的时间戳
    将为
    ,否则如果值
    更新
    修改的时间戳
    将具有当前日期

    如果在
    target
    表中有
    TimeStamp
    列,则上述查询将有效。如果将数据加载到
    数据仓库

    2.您可以使用
    MERGE
    语法执行更新,并在
    控制流
    中插入
    执行SQL任务
    。无需使用
    数据流任务
    。即使您没有任何
    时间戳列

    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
    语法的详细信息,请阅读和

    3.使用
    Multicast
    组件
    复制
    数据集以插入
    更新
    。将一个
    多播连接到
    lookmatch
    输出,将另一个多播连接到
    Lookup No match输出


    在SSIS 2008之前,您不能在
    目的地之后添加组件(插入新条目)。它只会给你一个
    错误输出
    第三个解决方案似乎最适合我的问题。我认为前两种方法在不同的服务器上使用DBs是行不通的。