2010-02-05 48 views
2

我需要使用遠程數據庫(也是同一本地網絡上不同服務器上的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 
    ) 

當然,做這些連接並通過導線比較是我的命。我確定有更好的方法 - 建議?

回答

3

考慮在本地系統中維護lastCompareTimestamp(上次執行比較)。使用ModifyDates> lastCmpareTimestamp獲取所有遠程記錄並將它們放入本地臨時表中。與他們在當地工作。

+0

不是一個壞主意 - 出於好奇,在那裏你會存儲lastCompareTimestamp? – 2010-02-05 17:44:29

+0

可能位於本地數據庫的新表中。可能是過度殺毒,但它給你一個始終可以訪問和輕鬆更新的位置。 – 2010-02-05 18:32:36

0

最後比較日期是一個偉大的想法

另外一個方法,我已經取得了巨大的成功與是SSIS(儘管它有一個學習曲線,除非你做這種類型的事情有很多可能是矯枉過正):

製作包裝

爲這兩個表格中的每一個設置一個數據源。如果您希望進行大量更改拉動整個表格,如果您只希望進行增量更改,請按mod日期進行過濾。確保結果的排序

漏斗兩個集合到一個完全外部聯接

拆分的結果加入到三個桶:不變的,變了,新

棄不變的記錄,發送新紀錄到插入目標,並將更改後的記錄發送到基於SQL的更新的登臺表,或者 - 對於少數幾行 - 帶有參數化更新語句的OLEDB命令。

,或者,如果SQL Server 2008上,使用合併