我正在将一些用户数据从一个SqlServer复制到另一个SqlServer.称他们为Alpha和Beta.SSIS包在Beta上运行,它获取Alpha上满足特定条件的行.然后,包将行添加到Beta的表中.非常简单,效果很好.
问题是我只想在Beta中添加新行.通常我会做一些像......一样简单的事情.
INSERT INTO BetaPeople
SELECT * From AlphaPeople
where ID NOT IN (SELECT ID FROM BetaPeople)
Run Code Online (Sandbox Code Playgroud)
但这在SSIS包中不起作用.至少我不知道这个问题是怎么回事.如何在服务器上执行此操作?
我用过的最简单的方法如下:
您的示例看起来很简单,看起来您只是在添加新人员,而不是在现有记录中查找更改的数据。在这种情况下,将最后一个ID存储在DB中。
CREATE TABLE dbo.LAST (RW int, LastID Int)
go
INSERT INTO dbo.LAST (RW, LastID) VALUES (1,0)
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用它插入已传输行的最后一个ID。
UPDATE dbo.LAST SET LastID = @myLastID WHERE RW = 1
Run Code Online (Sandbox Code Playgroud)
选择OLEDB源时,将数据访问模式设置为 SQL Command并使用
DECLARE @Last int
SET @Last = (SELECT LastID FROM dbo.LAST WHERE RW = 1)
SELECT * FROM AlphaPeople WHERE ID > @Last;
Run Code Online (Sandbox Code Playgroud)
注意,我确实假设您正在使用ID int IDENTITYPK。
如果必须监视现有记录的数据更改,则在每个表中都具有“上次更改”列,并存储上次传输的时间。
一个不同的技术将涉及对测试版的链接服务器的建立为Alpha和运行例如不使用SSIS。我希望这比SSIS解决方案要慢得多,而且会占用更多资源。
INSERT INTO dbo.BetaPeople
SELECT * FROM [Alpha].[myDB].[dbo].[AlphaPeople]
WHERE ID NOT IN (SELECT ID FROM dbo.BetaPeople)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23277 次 |
| 最近记录: |