SSIS-удаление строк
Я новичок в SSIS и нуждаюсь в помощи в этом. Я нашел статьи который описывает, как обнаружить строки, которые существуют и которые изменились. Часть, которую мне не хватает, - это обновление строк, которые изменились. Я нашел некоторые статьи, в которых говорится, что это также хорошее решение для удаления записей, которые изменились, и вставки нового набора записей. Дело в том, что я не знаю, как сделать этот шаг удаления (красный ящик).
какие предложения?
3 ответов
Если вам нужно удалить строки внутри Задача Потока Данных, тогда вам нужно использовать OLE DB Command
преобразование и написать оператор DELETE, как DELETE FROM dbo.Table WHERE ColumnName = ?
. Затем в сопоставлениях столбцов преобразования команды OLE DB параметр, представленный вопросительным знаком, сопоставляется с данными, полученными из предыдущего преобразования. В вашем случае данные, которые поступают от Union All 2.
однако я бы не рекомендовал этот вариант, потому что OLE DB Команда выполняется для каждой строки, и это может замедлить ваш пакет, если есть слишком много строк.
Я бы рекомендовал что-то вроде этого:
перенаправить вывод от
Union All 2
временную промежуточную таблицу (скажем dbo.Постановка) через назначение OLE DB.давайте предположим, что ваша конечная таблица назначения dbo.Пунктом. Теперь, ваша промежуточная таблица имеет все записи, которые следует удалить из назначения таблицы.
на Поток Управления tab, поместите
Execute SQL Task
послеData Flow Task
. В задаче "выполнение SQL" напишите инструкцию SQL или используйте хранимую процедуру, которая вызовет инструкцию SQL для соединения записей между промежуточной и целевой, чтобы удалить все соответствующие строки из целевой таблицы.кроме того, поместите другую задачу выполнения 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
Я рекомендую вам использовать ложку (чайник) это более гибкий, он имеет инструмент проектирования под названием "Поиск измерения/обновление", который поможет вам поддерживать таблицу измерений, вы можете указать, какое действие вы хотите, зависит от изменений столбца (обновить запись, вставить новую запись) все это на основе контроля времени версии записей.