如何在服务器之间复制数据时获取SSIS包以仅插入新记录

时间:2009-11-25 21:34:11

标签: sql-server ssis

我正在将一些用户数据从一个SqlServer复制到另一个SqlServer。称他们为Alpha和Beta。 SSIS包在Beta上运行,它获取Alpha上满足特定条件的行。然后,包将行添加到Beta的表中。很简单,效果很好。

问题是我只想在Beta中添加新行。通常我会做一些简单的事情......

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

但这在SSIS包中不起作用。至少我不知道这个问题是怎么回事。如何跨服务器进行此操作?

5 个答案:

答案 0 :(得分:4)

您的示例看起来很简单,看起来您只添加新人,而不是在现有记录中查找已更改的数据。在这种情况下,请将最后一个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

选择 OLEDB源时,将数据访问模式设置为 SQL命令并使用

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

注意,我确实假设您使用ID int IDENTITY作为PK。

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

不同的技术将涉及在Beta到Alpha上设置链接服务器并在不使用SSIS的情况下运行您的示例。我希望这比SSIS解决方案更慢,更耗费资源。

 INSERT INTO dbo.BetaPeople
 SELECT * FROM [Alpha].[myDB].[dbo].[AlphaPeople]
 WHERE ID NOT IN (SELECT ID FROM dbo.BetaPeople)

答案 1 :(得分:3)

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

  • 在数据流中的源任务中查询Alpha,并将记录引入数据流。
  • 执行任何所需的转换。
  • 在写入目标(测试版)之前,执行与Alpha中的ID列匹配的查找。在查找转换编辑器的第一页上,确保从下拉列表“指定如何处理现在匹配错误的行”中选择“将行重定向到无匹配输出”
  • 将查找任务链接到目标。这将为您提供一个提示,您可以在其中指定它是您要插入的不匹配行。

答案 2 :(得分:2)

这是经典的Delta检测问题。最佳解决方案是使用带/不带SSIS的Change Data Capture。如果您正在寻找的是一生一次的活动,则无需使用SSIS。使用其他方式,如链接服务器,并与现有记录进行比较。

答案 3 :(得分:1)

enter image description here

  1. 在源和目标之间添加查找
  2. 右键单击查阅框以打开“查找转换编辑器”。
  3. 选择[将行重定向到无匹配输出。
  4. enter image description here
  5. 打开列,映射关键列
  6. 在查找列中添加一个带有表键的条目,查找操作为 enter image description here
  7. 将查询框连接到目的地,选择[查找无匹配输出]

答案 4 :(得分:0)

以下内容应解决使用SSIS加载Changed和New记录的问题:

  1. 从源usint数据流中提取数据。
  2. 从目标中提取数据。
  3. 匹配主键添加Unmatch记录并从Target中匹配来源和匹配记录中拆分匹配和匹配的记录称为Matched_Source, Unmatch_Source和Matched_Target。
  4. 将Matched_Source和Matched_Target以及Split Matched_Source比较为Changed和Unchanged。
  5. 空载TempChanged表。
  6. 将更改的记录添加到TempChanged。
  7. 执行SQL脚本/存储过程以从目标中删除记录以获取TempChanged中的主键,并将TempChanged中的记录添加到目标。
  8. 将Unmatched_Source添加到目标。