SSIS (в SQL Server 2012): компонент Upsert in Lookup

61
5

У меня есть> 10 пакетов, которые необходимо обновить/вставить в поток данных. Я могу это сделать:

    Lookup => Соответствие выходных ветвей => Команда OLE DB. Lookup => Нет ответной ветки вывода => Назначение OLE DB.

(http://www.rad.pasfu.com/index.php?/archives/46-SSIS-Upsert-With-Lookup-Transform.html) (http://jahaines.blogspot.com/2009/09/sss -performing-upsert.html)

Тем не менее, мне было интересно, есть ли способ использовать выражение "Слияние" в компоненте Lookup (или в любом другом), чтобы я мог сделать что-то вроде:

MERGE [DBPrac].[dbo].[TargetTable] AS tt
USING [SourceTable] AS st ON tt.Id = st.Id

WHEN MATCHED THEN --* Update the records, if record found based on Id.
UPDATE
SET tt.SSN = st.SSN
,tt.FirstName = st.FirstName
,tt.MiddleName = st.MiddleName
,tt.LastName = st.LastName
,tt.Gender = st.Gender
,tt.DateOfBirth = st.DateOfBirth
,tt.Email = st.Email
,tt.Phone = st.Phone
,tt.Comment = st.Comment

WHEN NOT MATCHED BY TARGET THEN --* Insert from source to target.
INSERT (Id, SSN, FirstName, MiddleName, LastName, Gender, DateOfBirth, Email, Phone, Comment)
VALUES (st.Id, st.SSN, st.FirstName, st.MiddleName, st.LastName, st.Gender, st.DateOfBirth, st.Email, st.Phone, st.Comment)
;

SELECT @@ROWCOUNT;

SET IDENTITY_INSERT [dbo].[TargetTable] OFF
GO

До сих пор я пытался:

    В компоненте Lookup "Advanced" в "Пользовательский запрос" я попытался использовать вышеупомянутый запрос, но наткнулся на "SourceTable". Не знаю, как получить вводный набор записей в "Пользовательский запрос" (не знаю, возможно ли это).

Любая помощь и/или указатель были бы замечательными.

спросил(а) 2021-01-19T19:21:54+03:00 1 месяц, 1 неделя назад
1
Решение
104

Да, вы можете использовать MERGE, но вам нужно загрузить свои данные в промежуточную таблицу. Это метод "ELT" - извлечение, загрузка (в базу данных), преобразование, в отличие от метода "ETL" - извлечение, преобразование (в пакете), загрузка (в базу данных)

Обычно я нахожу метод ELT более быстрым и более удобным, если вы не против работать со сценариями SQL. Конечно, одно массовое обновление выполняется быстрее, чем обновление строки за строкой, которое происходит в SSIS

ответил(а) 2021-01-19T19:21:54+03:00 1 месяц, 1 неделя назад
44

Если я правильно понял ваш вопрос, просто выполните оператор Merge с помощью задачи Execute SQL. Тогда вам не нужны никакие Lookups. Мы используем ту же стратегию для конечной загрузки нашего склада из этапа.

ответил(а) 2021-01-19T19:21:54+03:00 1 месяц, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема