我正在将一些用户数据从一个SqlServer复制到另一个SqlServer。称他们为Alpha和Beta。 SSIS包在Beta上运行,它获取Alpha上满足特定条件的行。然后,包将行添加到Beta的表中。很简单,效果很好。
问题是我只想在Beta中添加新行。通常我会做一些简单的事情......
INSERT INTO BetaPeople
SELECT * From AlphaPeople
where ID NOT IN (SELECT ID FROM BetaPeople)
但这在SSIS包中不起作用。至少我不知道这个问题是怎么回事。如何跨服务器进行此操作?
答案 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)
我使用过的最简单的方法如下:
答案 2 :(得分:2)
这是经典的Delta检测问题。最佳解决方案是使用带/不带SSIS的Change Data Capture。如果您正在寻找的是一生一次的活动,则无需使用SSIS。使用其他方式,如链接服务器,并与现有记录进行比较。
答案 3 :(得分:1)
答案 4 :(得分:0)
以下内容应解决使用SSIS加载Changed和New记录的问题: