Простой способ перезаписи старых строк в пакете служб SSIS - PullRequest
1 голос
/ 26 марта 2019

Я создал пакет служб SSIS с компонентом сценария, который вызывает данные из JSON API и вставляет их в таблицу в SQL Server.Я настроил логику для добавления новых строк, однако я хочу найти наиболее подходящий способ удаления / перезаписи старых строк.Данные выбираются каждые 4 часа, поэтому каждый раз при запуске пакета происходит перекрытие примерно 1000 строк.

Моей первой мыслью было просто добавить задачу SQL после задачи потока данных, которая удаляет дублирующиеся строки (с наименьшим номером ID).Тем не менее, мне было интересно, как это сделать в Задаче потока данных?Вызов API выбирает не более 5000 строк каждый раз, таблица назначения имеет около 1 м строк, а весь проект выполняется за ок.10 секунд.

Моя простая задача потока данных выглядит следующим образом:

enter image description here

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Итак, я выяснил, что самым простым решением в моем случае (в случае, когда обновляется только относительно небольшое количество строк) было использование компонента OLE DB, как показано ниже.

enter image description here

В компонент добавлен оператор SQL Update с логикой, такой как:

UPDATE  [dbo].[table]
SET    [value1]=?,
       [value2]=?,
       [value2]=?,
WHERE  [value1]=? 

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

enter image description here

2 голосов
/ 26 марта 2019

Есть два основных подхода, которые вы можете попробовать:

  • Выполнить поиск по идентификатору строки. Если это соответствует, запустите OLEDB Command Transformation для каждой строки с оператором UPDATE. Если не совпадает - направьте строки в пункт назначения OLE DB.
    Простая в реализации, простая логика, но множество операторов UPDATE создаст проблемы с производительностью.

  • Создайте промежуточную таблицу в БД, очистите ее перед запуском Задачи потока данных и сохраните все строки в потоке данных в этой промежуточной таблице. Затем по следующему заданию - выполните одно из следующих действий:

    • MERGE промежуточный стол с основным столом. Больше информации о MERGE .

    • В транзакции - отбросить строки из основной таблицы, которая существует на промежуточной, затем выполнить INSERT INTO <main table> SELECT ... FROM <intermediate table>

Я обычно предпочитаю подход с промежуточным столом с MERGE - производительный, простой и гибкий. Оператор MERGE может иметь отрицательные последствия при запуске в параллельных сеансах или в кластеризованных таблицах columnstore, тогда я использую промежуточную таблицу с командой DELETE...INSERT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...