Как получить пакет служб SSIS для вставки только новых записей при копировании данных между серверами - PullRequest
6 голосов
/ 26 ноября 2009

Я копирую некоторые пользовательские данные с одного SqlServer на другой. Назовите их Альфа и Бета. Пакет служб SSIS выполняется в бета-версии и получает строки в альфе, которые удовлетворяют определенному условию. Затем пакет добавляет строки в таблицу Beta. Довольно просто, и это прекрасно работает.

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

INSERT INTO BetaPeople
 SELECT * From AlphaPeople
 where ID NOT IN (SELECT ID FROM BetaPeople)

Но это не работает в пакете служб SSIS. По крайней мере, я не знаю как, и в этом суть этого вопроса. Как можно поступить так на разных серверах?

Ответы [ 5 ]

4 голосов
/ 26 ноября 2009

Ваш пример кажется простым, похоже, что вы добавляете только новых людей, а не ищете измененные данные в существующих записях. В этом случае сохраните последний идентификатор в БД.

CREATE TABLE dbo.LAST (RW int, LastID Int)
go
INSERT INTO dbo.LAST (RW, LastID) VALUES (1,0)

Теперь вы можете использовать это для вставки последнего идентификатора переданной строки.

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 для своего ПК.

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

A другой метод будет включать настройку связанного сервера на бета-версии Alpha и запуск вашего примера без использования служб SSIS. Я ожидаю, что это будет намного медленнее и более ресурсоемким, чем решение SSIS.

 INSERT INTO dbo.BetaPeople
 SELECT * FROM [Alpha].[myDB].[dbo].[AlphaPeople]
 WHERE ID NOT IN (SELECT ID FROM dbo.BetaPeople)
3 голосов
/ 06 января 2010

Простейший метод, который я использовал, выглядит следующим образом:

  • Запросите альфа в исходной задаче в потоке данных и внесите записи в поток данных.
  • Выполните любые необходимые преобразования.
  • Перед записью в адрес назначения (бета-версия) выполните поиск, сопоставив столбец идентификатора от альфы до бета-версии. На первой странице редактора «Преобразование« Уточняющий запрос »убедитесь, что в раскрывающемся списке« Перенаправить строки в выходные данные без совпадений »« Укажите, как обрабатывать строки с ошибкой сопоставления теперь »
  • Свяжите задачу поиска с пунктом назначения. Это даст вам подсказку, в которой вы сможете указать, что это несопоставленные строки, которые вы хотите вставить.
2 голосов
/ 29 ноября 2009

Это классическая проблема обнаружения Delta. Лучшее решение - использовать Change Data Capture с / без SSIS. Если то, что вы ищете, является раз в жизни, не нужно переходить на SSIS. Используйте другие средства, такие как связанный сервер, и сравните с существующими записями.

1 голос
/ 18 марта 2016

enter image description here

  1. Добавить поиск между вашим источником и местом назначения
  2. Щелкните правой кнопкой мыши по окну поиска, чтобы открыть редактор преобразования «Уточняющий запрос».
  3. Выберите [Перенаправить строки, чтобы не было совпадений.
  4. enter image description here
  5. Открыть столбцы, сопоставить ваши ключевые столбцы,
  6. Добавить запись с ключом таблицы в столбце поиска, операция поиска выполняется как enter image description here
  7. Подключите окно поиска к месту назначения, выберите [Lookup no Match Output]
0 голосов
/ 10 февраля 2012

Следующее должно решить проблему загрузки Измененных и Новых записей, используя SSIS:

  1. Извлечение данных из источника usint Поток данных.
  2. Извлечение данных из цели.
  3. Совпадение по первичному ключу. Добавить несоответствующие записи и разделить сопоставленные и несопоставленные записи из исходных и сопоставленных записей из Target, называя их Matched_Source, Unmatch_Source и Matched_Target.
  4. Сравните Matched_Source и Matched_Target и Split Matched_Source с Измененными и Без изменений.
  5. Таблица нулевой нагрузки TempChanged.
  6. Добавление измененных записей в TempChanged.
  7. Выполнение сценария SQL / сохраненного процесса для удаления записей из цели для первичного ключа в TempChanged и добавление записей в TempChanged для цели.
  8. Добавить Unmatched_Source в Target.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...