2010-02-05 3 views
2

Мне нужно обновить базу данных контактов в SQL Server с изменениями в удаленной базе данных (также SQL Server, на другом сервере в той же локальной сети). Я не могу внести никаких изменений в удаленную базу данных, которая является коммерческим продуктом. Я подключен к удаленной базе данных с помощью связанного сервера. Обе таблицы содержат около 200 тыс. Строк.Как я могу эффективно сравнивать свои данные с удаленной базой данных?

Моя логика в этот момент очень прост: [упрощенный псевдо-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? –

+0

Возможно, в новой таблице в локальной базе данных. Возможно, излишний, но он дает вам всегда доступное и легко обновляемое местоположение. –

0

Последнее сравнение дата отличная идея

Еще один метод, который я имел большой успех с является SSIS (хотя она имеет кривую обучения, и может быть излишним, если вы не сделаете этого типа вещи много):

Сделать пакет

Установить источник данных для каждого из этих двух таблиц. Если вы ожидаете, что много изменений вытащит целые таблицы, если вы ожидаете только инкрементных изменений, то фильтруйте по дате мод. Убедитесь в том, что результаты упорядочиваются

Воронка оба набора в полное внешнее объединение

Split результаты джойна в трех ведер: без изменений, изменилось, новый

Отбросить неизмененные записи, отправить новые записи в пункт назначения вставки и отправить измененные записи в промежуточную таблицу для SQL-обновления, или - для нескольких строк - команду OLEDB с параметризованным оператором обновления.

ИЛИ, если на SQL Server 2008, используйте Merge

Смежные вопросы