如何避免在重新运行将数据从平面文件加载到SQL表的SSIS包时重新插入数据到sql表中?

时间:2015-04-17 07:26:55

标签: sql-server ssis

我有一个包含以下数据的平面文件

Id,FirstName,LastName,Address,PhoneNumber
1,ben,afflick,xyz Address,5014123746
3,christina,smith,test address,111000110
1,ben,afflick,xyz Address,5014123746
3,christina,smith,test address,111000110
4,nash,gordon,charlotte NC ADDRESS,111200110

我创建了一个具有平面文件源的SSIS包,以及一个聚合函数,该函数确保只插入唯一行,而不是平面文件中的重复记录,以及SQL表作为目标。

当我运行包时,一切都很好,我在SQL表中得到低于输出

Id  FName   LName   Address phoneNumber
1   ben afflick xyz Address 5014123746
4   nash    gordon  charlotte NC ADDRESS    111200110
3   christina   smith   test address    111000110

但是当我向平面文件中添加一些新数据时,如下所示

Id,FirstName,LastName,Address,PhoneNumber
1,ben,afflick,xyz Address,5014123746
3,christina,smith,test address,111000110
1,ben,afflick,xyz Address,5014123746
3,christina,smith,test address,111000110
4,nash,gordon,charlotte NC ADDRESS,111200110
5,abc,xyz,New York,9999988888

并重新运行包,表中已存在的数据将重新插入,如下所示

1   ben afflick xyz Address 5014123746
4   nash    gordon  charlotte NC ADDRESS    111200110
3   christina   smith   test address    111000110
1   ben afflick xyz Address 5014123746
5   abc xyz New York    9999988888
4   nash    gordon  charlotte NC ADDRESS    111200110
3   christina   smith   test address    111000110

但我不想要这个,我不想要插入已经存在的数据。 我只想将新添加的数据插入到SQL表中。

有人可以帮助我实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

您的数据流任务看起来像这样。这里,Flat文件源读取CSV文件,然后将数据传递给Lookup转换。此转换将检查目标表中的现有数据。如果没有匹配的记录,则CSV文件中的数据将被发送到OLE DB目的地,否则,数据将仅被丢弃。 查找转换链接---

http://www.codeproject.com/Tips/574437/Term-Lookup-Transformation-in-SSIS

sort and lookup transformation in ssis

答案 1 :(得分:1)

另一种方法是将文件加载到数据库中的临时表中,然后使用merge语句将数据插入目标表。

实际上,这看起来像是从平面文件到登台表的数据流,然后是包含合并语句的执行sql任务。 如果愿意,您也可以更新任何匹配的值。

merge into table_a 
using stage_a
on stage_a.key = table_a.key
when not matched then insert (a,b,c,d) values ( a,b,c,d )