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

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

12 голосов
/ 31 августа 2011

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

Есть предложения?

enter image description here

Ответы [ 3 ]

21 голосов
/ 31 августа 2011

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

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

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

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

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

  3. На вкладке Поток управления поместите 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

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

1 голос
/ 18 августа 2015

В дополнение к 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
0 голосов
/ 06 июля 2013

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

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