【问题标题】:SSIS OLEDB Command transformation (Insert if not exists)SSIS OLEDB 命令转换(如果不存在则插入)
【发布时间】:2013-08-06 15:22:23
【问题描述】:

好的,根据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 部分(仅保留插入部分),控件说可能代码是好的,我做错了什么。

有没有更简单的解决方案?

更新:顺便说一句,我的来源是平面文件(csv 文件)

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

【问题讨论】:

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


    【解决方案1】:

    OLEDB Command 对象与OLE DB Destination 不同

    不要像你描述的那样做,而是使用Lookup Component。您的数据流变为平面文件源 -> 查找组件 -> OLE DB 目标

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

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

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

    【讨论】:

    • 非常感谢,我知道应该有一个简单的方法来做到这一点
    【解决方案2】:

    虽然您可以使用 SSIS 中的查找组件来避免重复,这是最好的方法,但是如果您正在寻找一些查询来避免重复,您可以简单地将所有数据插入一些 temp/暂存表,然后运行以下查询。

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

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多