Преобразование команды SSIS OLEDB (вставьте, если не существует)

Итак, согласно Microsoft docs, преобразование команды OLE DB в SSIS делает это

Преобразование «Команда OLE DB» запускает инструкцию SQL для каждой строки в потоке данных. Например, вы можете запустить оператор SQL, который вставляет, обновляет или удаляет строки в таблице базы данных.

Итак, я хочу написать SQL для вставки строк в одну из моих таблиц только если запись не существует

Итак, я попробовал это, но элементы управления продолжают жаловаться на плохой синтаксис

IF NOT EXISTS
(SELECT * FROM M_Employee_Login WHERE 
           Column1=?
           AND Column2=?
           AND Column3=?)

INSERT INTO [M_Employee_Login]
           ([Column1]
           ,[Column2]
           ,[Column3])
     VALUES
           (?,?,?)

Однако, если я удалю раздел IF NOT EXISTS (оставив только вставку), элементы управления говорят, что код может быть в порядке, что я делаю неправильно.

Есть ли более простое решение?

Обновление: Кстати, мой источник — это плоский файл (CSV-файл).

Обновление после ответа: просто чтобы люди знали. В итоге я использовал OLE DB Command Transformation, как и планировал, потому что лучше, чем OLE DB Destination для этой операции. Разница в том, что я использовал Lookup Component для фильтрации всех уже существующих записей (как предложенный ответ). Затем используйте OLE DB Command Transformation с Insert SQL, которые у меня были в вопросе, и это сработало, как и ожидалось. Надеюсь, поможет


person Termiux    schedule 05.08.2013    source источник


Ответы (2)


OLEDB Command объект не совпадает с OLE DB Destination

Вместо того, чтобы делать это, как вы описываете, вместо этого используйте Lookup Component. Ваш поток данных становится Источником плоского файла -> Компонент поиска -> Назначение OLE DB.

В вашем поиске вы напишете запрос SELECT Column1, Column2, Column3 FROM M_Employee_Login и настроите его таким образом, чтобы он перенаправлял несоответствующие объекты в поток вместо отказа (в зависимости от вашей версии 2005 или не 2005), это будет по умолчанию.

После поиска выходные данные No Match будут содержать значения, которые не нашли соответствующего совпадения в целевой таблице.

Наконец, настройте пункт назначения OLEDB для выполнения опции быстрой загрузки.

person billinkc    schedule 05.08.2013
comment
Большое спасибо, я знал, что должен быть простой способ сделать это - person Termiux; 06.08.2013

Хотя вы можете использовать компонент поиска в SSIS, чтобы избежать дубликатов, что является наилучшим подходом, но если вы ищете какой-то запрос, чтобы избежать дубликатов, вы можете просто вставить все данные в какую-то временную/промежуточную таблицу в вашу базу данных и выполните следующий запрос.

INSERT INTO M_Employee_Login(Column1, Column2, Column3)
SELECT vAL1,vAL2,vAL3 from Staging_Table
EXCEPT
SELECT Column1, Column2, Column3 FROM M_Employee_Login
person Sonam    schedule 05.08.2013