SSIS OLEDB命令转换(如果不存在则插入)

时间:2013-08-05 19:38:03

标签: sql-server insert ssis oledb insert-update

好的,根据Microsoft docs,SSIS中的OLE DB命令转换执行此操作

  

OLE DB命令转换为数据流中的每一行运行一条SQL语句。例如,您可以运行在数据库表中插入,更新或删除行的SQL语句。

所以我想在我的一个表格中写一些SQL来插入行仅在记录不存在的情况下

所以我尝试了这个,但控件一直在抱怨坏的sintaxys

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部分(只留下插入),控件说可能代码没问题,我做错了什么。

有更简单的解决方案吗?

更新: BTW我的来源是平面文件(csv文件)

自回答后更新:只是为了让人们知道。我最终使用了OLE DB Command Transformation,就像我计划的原因比这个操作的OLE DB Destination更好。不同之处在于我确实使用Lookup Component来过滤所有已存在的记录(如建议的答案)。然后将OLE DB Command Transformation与我在问题中使用的Insert SQL一起使用,并按预期工作。希望它有所帮助

2 个答案:

答案 0 :(得分:2)

OLEDB Command对象与OLE DB Destination

不同

而不是按照您的描述进行操作,而是使用Lookup Component。您的数据流变为平面文件源 - >查找组件 - > OLE DB目标

在查找中,您将编写查询SELECT Column1, Column2, Column3 FROM M_Employee_Login并对其进行配置,使其不会将匹配实体重定向到流而不是失败(取决于您的版本2005与非2005),这将是默认值。

查找后,No Match的输出将包含在目标表中未找到相应匹配项的值。

最后,配置OLEDB目标以执行快速加载选项。

答案 1 :(得分:2)

虽然您可以在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