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

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

какие предложения?

enter image description here

3 ответов


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

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

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

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

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

  3. на Поток Управления tab, поместите Execute SQL Task после Data Flow Task. В задаче "выполнение SQL" напишите инструкцию SQL или используйте хранимую процедуру, которая вызовет инструкцию SQL для соединения записей между промежуточной и целевой, чтобы удалить все соответствующие строки из целевой таблицы.

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

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

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

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


кроме user756519 ответ. Если у вас есть миллионы записей, чтобы удалить последний шаг (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

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