Ответ 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
Надеюсь, что это поможет.