SSIS - удаление строк

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

Любые предложения?

enter image description here

Ответ 1

Если вам нужно удалить строки в задаче потока данных, вам нужно использовать преобразование OLE DB Command и написать оператор DELETE, например DELETE FROM dbo.Table WHERE ColumnName = ?. Затем в сопоставлениях столбцов преобразования OLE DB Command вы сопоставляете параметр, представленный вопросительным знаком, с данными, полученными из предыдущего преобразования. В вашем случае данные, поступающие от Union All 2.

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

Я бы рекомендовал что-то вроде этого:

  • Перенаправить вывод из Union All 2 во временную промежуточную таблицу (скажем dbo.Staging) с использованием назначения OLE DB.

  • Предположим, что ваша конечная таблица назначения dbo.Destination. Теперь в вашей таблице промежуточных записей есть все записи, которые следует удалить из таблицы Destination.

  • На вкладке Контроль потока поместите Execute SQL Task после Data Flow Task. В Execute SQL Task напишите инструкцию SQL или используйте хранимую процедуру, которая вызовет оператор SQL, чтобы присоединиться к записям между Staging и Destination, чтобы удалить все соответствующие строки из таблицы назначения.

  • Кроме того, перед выполнением задачи потока данных поместите другую задачу выполнения SQL. В этой задаче Execute SQL Task удалите/усекайте строки из таблицы подстановки.

Что-то вроде этого может работать для удаления строк:.

DELETE      D
FROM        dbo.Destination D
INNER JOIN  dbo.Staging     S
ON          D.DestinationId = S.StagingId

Надеюсь, что это поможет.

Ответ 2

В дополнение к user756519 answer. Если у вас есть миллионы записей для удаления последнего шага (4) для оператора ExecuteSQL Delete, это может быть сделано партиями с чем-то вроде этого:

WHILE (1=1)
BEGIN
    DELETE D
    from dbo.Destination D
    inner join
    (
        -- select ids that should be removed from table
        SELECT TOP(10000) DestinationId
        FROM
            (
            SELECT
                D1.DestinationId,
                S.StagingId
            from 
                dbo.Destination as D1
            LEFT JOIN
                dbo.Staging as S
            ON
                D1.DestinationId = S.StagingId
            ) AS G
        WHERE
            StagingId IS NULL
    ) as R
    on D.DestinationId = R.DestinationId;

    IF @@ROWCOUNT < 1 BREAK

    -- info message
    DECLARE @timestamp VARCHAR(50)
    SELECT @timestamp = CAST(getdate() AS VARCHAR)
    RAISERROR ('Chunk deleted %s', 10, 1,@timestamp) WITH NOWAIT
END

Ответ 3

Я рекомендую вам использовать Spoon (Kettle) более гибко, у него есть инструмент проектирования под названием "Поиск/обновление размеров", который помогает вам обслуживать таблицу измерений, вы можете указать, какое действие вы хотите, зависит от изменения столбца ( обновить запись, вставить новую запись), все это основано на управлении версиями времени.