Как получить пакет служб SSIS только для вставки новых записей при копировании данных между серверами

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

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

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

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

5 ответов


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

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 source, set режим доступа к данным to команда SQL и использовать

DECLARE @Last int
SET @Last = (SELECT LastID FROM dbo.LAST WHERE RW = 1)
SELECT * FROM AlphaPeople WHERE ID > @Last;

примечание, Я предполагаю, что вы используете ID int IDENTITY для твой ПК.

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

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

 INSERT INTO dbo.BetaPeople
 SELECT * FROM [Alpha].[myDB].[dbo].[AlphaPeople]
 WHERE ID NOT IN (SELECT ID FROM dbo.BetaPeople)

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

  • запрос Alpha в исходной задаче в потоке данных и ввод записей в поток данных.
  • выполните все необходимые преобразования.
  • перед записью в пункт назначения (бета-версия) выполните поиск, соответствующий столбцу ID от Alpha до бета-версии. На первой странице редактора преобразования "уточняющий запрос" выберите в раскрывающемся списке "перенаправить строки на вывод без совпадений "" укажите, как обрабатывать строки с теперь соответствующей ошибкой"
  • связать задачу поиска с пунктом назначения. Это даст вам подсказку, где вы можете указать, что это непревзойденные строки, которые вы хотите вставить.

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


enter image description here

  1. добавить поиск между источником и пунктом назначения
  2. щелкните правой кнопкой мыши поле поиска, чтобы открыть редактор преобразования поиска.
  3. выберите [перенаправить строки без вывода соответствия.
  4. enter image description here
  5. открыть столбцы, сопоставить ключевые столбцы,
  6. добавить запись с ключом таблицы в столбце поиска, операция поиска как enter image description here
  7. подключить окно поиска к пункт назначения, выберите [Поиск нет вывода соответствия]

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

  1. извлечение данных из исходного потока данных usint.
  2. извлечение данных из цели.
  3. совпадение по первичному ключу добавление записей несовпадения и разделение сопоставленных и несопоставленных записей из источника и сопоставленных записей из цели вызовите их Matched_Source, Unmatch_Source и Matched_Target.
  4. сравнить Matched_Source и Matched_Target и разделить Matched_Source на изменен и без изменений.
  5. нулевая таблица TempChanged нагрузки.
  6. добавить измененные записи в TempChanged.
  7. Execute SQL script / stored proc для удаления записей из целевого объекта для первичного ключа в TempChanged и добавления записей в TempChanged в целевой объект.
  8. добавить Unmatched_Source в Target.