我需要使用远程数据库(也是SQL Server,在同一本地网络上的不同服务器上)中的更改来更新SQL Server中的联系人数据库。我无法对远程数据库进行任何更改,这是一种商业产品。我使用链接服务器连接到远程数据库。两个表都包含大约200K行。
此时我的逻辑很简单:[简化的伪SQL跟随]
/* Get IDs of new contacts into local temp table */
Select remote.ID into #NewContactIDs
From Remote.Contacts remote
Left Join Local.Contacts local on remote.ID=local.ID
Where local.ID is null
/* Get IDs of changed contacts */
Select remote.ID into #ChangedContactIDs
From Remote.Contacts remote
Join Local.Contacts local on remote.ID=local.ID
Where local.ModifyDate < remote.ModifyDate
/* Pull down all new or changed contacts */
Select ID, FirstName, LastName, Email, ...
Into #NewOrChangedContacts
From Remote.Contacts remote
Where remote.ID in (
Select ID from #NewContactIDs
union
Select ID from #ChangedContactIDs
)
当然,通过电线进行这些连接和比较正在扼杀我。我确定有更好的方法 - 建议吗?
答案 0 :(得分:3)
考虑在本地系统中维护lastCompareTimestamp(上次进行比较)。使用ModifyDates&gt;抓取所有远程记录lastCmpareTimestamp并将它们放在本地临时表中。与他们在当地合作。
答案 1 :(得分:0)
最后一个比较日期是个好主意
另一种我取得了巨大成功的方法是SSIS(虽然它有一个学习曲线,除非你经常做这类事情,否则可能有点过分了):
制作包
为两个表中的每个表设置数据源。如果你期望很多变化拉动整个表格,如果你只想要增量变化,那么按模式日期过滤。确保结果已订购
漏斗两者都设置为完全外部联接
将联接的结果拆分为三个桶:未更改,已更改,新
丢弃未更改的记录,将新记录发送到插入目标,并将更改的记录发送到基于SQL的更新的临时表,或者 - 对于少数行 - 发送带有参数化更新语句的OLEDB命令。 / p>
OR,如果在SQL Server 2008上,请使用Merge