SSIS OLEDB Command transformation (Insert if not exists)

狂风中的少年 提交于 2019-12-11 11:59:27

问题


Ok so according to Microsoft docs the OLE DB Command Transformation in SSIS does this

The OLE DB Command transformation runs an SQL statement for each row in a data flow. For example, you can run an SQL statement that inserts, updates, or deletes rows in a database table.

So I want to write some SQL to Insert rows in one of my tables only IF the record doesn't exists

So I tried this but the controls keeps complaining of bad sintaxys

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

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

However if I remove the IF NOT EXISTS section (leaving the insert only) the controls says may code is Ok, what am I doing wrong.

Is there an easier solution?

Update: BTW My source is a Flat File (csv file)

Update since answer: Just to let people know. I ended up using the OLE DB Command Transformation like I planned cause is better than the OLE DB Destination for this operation. The difference is that I did used the Lookup Component to filter all the already existent records (like the answer suggested). Then use the OLE DB Command Transformation with the Insert SQL that I had in the question and it worked as expected. Hope it helps


回答1:


OLEDB Command object is not the same as the OLE DB Destination

Rather than doing it as you describe, instead use a Lookup Component. Your data flow becomes Flat File Source -> Lookup Component -> OLE DB Destination

In your lookup, you will write the query SELECT Column1, Column2, Column3 FROM M_Employee_Login and configure it such that it will redirect no match entities to the stream instead of failure (depending on your version 2005 vs not 2005) this will be the default.

After the lookup, the output of No Match will contain the values that didn't find a corresponding match in the target table.

Finally, configure your OLEDB Destination to perform the fast load option.




回答2:


Though you can make use of Look up component in SSIS to avoid the duplicates which is the best possible approach, but if you are looking for some query to avoid the duplicates then, you can simply insert all the data in some temp/staging table in your database, and run the following query.

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


来源:https://stackoverflow.com/questions/18066301/ssis-oledb-command-transformation-insert-if-not-exists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!