代码之家  ›  专栏  ›  技术社区  ›  Craig

在服务器之间复制数据时,如何使SSIS包只插入新记录?

  •  6
  • Craig  · 技术社区  · 15 年前

    我正在将一些用户数据从一个SQLServer复制到另一个。叫他们阿尔法和贝塔。ssis包在beta上运行,它获取alpha上满足特定条件的行。然后包将这些行添加到beta的表中。很简单,效果很好。

    问题是我只想在beta中添加新行。通常我会做一些简单的事情,比如……

    INSERT INTO BetaPeople
     SELECT * From AlphaPeople
     where ID NOT IN (SELECT ID FROM BetaPeople)
    

    但这在SSIS包中不起作用。至少我不知道怎么做,这就是这个问题的关键所在。如何在服务器之间执行此操作?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Damir Sudarevic    15 年前

    您的示例似乎很简单,看起来您只是添加了新的人员,而不是在现有记录中查找更改的数据。在这种情况下,将最后一个ID存储在数据库中。

    CREATE TABLE dbo.LAST (RW int, LastID Int)
    go
    INSERT INTO dbo.LAST (RW, LastID) VALUES (1,0)
    

    现在,您可以使用它插入所传输行的最后一个ID。

    UPDATE dbo.LAST SET LastID = @myLastID WHERE RW = 1
    

    选择时 OLED源 ,集合 数据访问模式 SQL命令 使用

    DECLARE @Last int
    SET @Last = (SELECT LastID FROM dbo.LAST WHERE RW = 1)
    SELECT * FROM AlphaPeople WHERE ID > @Last;
    

    注意,我假设您正在使用 ID int IDENTITY 为您的PK。

    如果必须监视现有记录的数据更改,则在每个表中都有“上次更改”列,并存储上次传输的时间。

    不同的技术 将涉及在beta-to-alpha上设置链接服务器,并在不使用ssis的情况下运行示例。我希望这比SSIS解决方案慢得多,而且资源密集。

     INSERT INTO dbo.BetaPeople
     SELECT * FROM [Alpha].[myDB].[dbo].[AlphaPeople]
     WHERE ID NOT IN (SELECT ID FROM dbo.BetaPeople)
    
        2
  •  3
  •   Mike    10 年前

    我使用的最简单方法如下:

    • 在数据流中的源任务中查询alpha并将记录引入数据流。
    • 执行任何需要的转换。
    • 在写入目标(beta)之前,执行一个查找,将id列从alpha匹配到beta中的列。在查找转换编辑器的第一页上,确保从下拉列表中选择“将行重定向到不匹配的输出”,“指定如何处理当前存在匹配错误的行”。
    • 将查找任务链接到目标。这将给您一个提示,您可以在其中指定要插入的行不匹配。
        3
  •  2
  •   Faiz    15 年前

    这是经典的增量检测问题。最好的解决方案是使用带有/不带SSIS的变更数据捕获。如果你所寻找的是一个一生中只有一次的活动,那么就不需要去寻找ssis。使用其他方法,如链接服务器,并与现有记录进行比较。

        4
  •  1
  •   RAY    8 年前

    enter image description here

    1. 在源和目标之间添加查找
    2. 右键单击查找框打开查找转换编辑器。
    3. 选择[将行重定向到无匹配输出。
    4. enter image description here
    5. 打开列,映射关键列,
    6. 在查找列中添加表键为的条目,查找操作为 enter image description here
    7. 将查找框连接到目标,选择[查找无匹配输出]
        5
  •  0
  •   j.w.r doomy    12 年前

    以下应解决加载更改和使用SSIS的新记录的问题:

    1. 使用数据流从源中提取数据。
    2. 从目标中提取数据。
    3. 在主键上匹配添加不匹配记录,并从源中拆分匹配和不匹配的记录,从目标调用匹配的记录。 取消匹配源和匹配目标。
    4. 比较匹配的_源和匹配的_目标,并将匹配的_源拆分为已更改和未更改。
    5. 空的加载tempchanged表。
    6. 将更改的记录添加到tempChanged。
    7. 执行SQL脚本/存储过程以从tempchanged中的主键的目标中删除记录,并将tempchanged中的记录添加到目标中。
    8. 向目标添加不匹配的资源。