Как получить пакет служб 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. Используйте другие средства, такие как связанный сервер и сравните с существующими записями.
- добавить поиск между источником и пунктом назначения
- щелкните правой кнопкой мыши поле поиска, чтобы открыть редактор преобразования поиска.
- выберите [перенаправить строки без вывода соответствия.
- открыть столбцы, сопоставить ключевые столбцы,
- добавить запись с ключом таблицы в столбце поиска, операция поиска как
- подключить окно поиска к пункт назначения, выберите [Поиск нет вывода соответствия]
следующее должно решить проблему загрузки измененных и новых записей с помощью служб SSIS:
- извлечение данных из исходного потока данных usint.
- извлечение данных из цели.
- совпадение по первичному ключу добавление записей несовпадения и разделение сопоставленных и несопоставленных записей из источника и сопоставленных записей из цели вызовите их Matched_Source, Unmatch_Source и Matched_Target.
- сравнить Matched_Source и Matched_Target и разделить Matched_Source на изменен и без изменений.
- нулевая таблица TempChanged нагрузки.
- добавить измененные записи в TempChanged.
- Execute SQL script / stored proc для удаления записей из целевого объекта для первичного ключа в TempChanged и добавления записей в TempChanged в целевой объект.
- добавить Unmatched_Source в Target.