1

好的,根据Microsoft 文档,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 TransformationInsert SQL在问题中遇到的,它按预期工作。希望能帮助到你

4

2 回答 2

2

OLEDB Command对象不一样OLE DB Destination

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

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

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

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

于 2013-08-05T19:48:38.307 回答
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
于 2013-08-05T20:10:02.737 回答