Server 2012:使用SSIS包,如何在插入之前验证源记录是否重复?
我们的源文件是一个.csv。我们正面临加载在暂存表中的重复记录。
目前,我们正在采用手工加载数据的过程。
如何在加载和仅加载有效记录之前根据目标表验证源文件数据?加载重复记录的可能性不仅是因为源文件中有重复记录,而且还因为将同一文件重新加载到暂存表中。
我们不会截断暂存表。我们正在按原样记录。
第二个问题:如何选择源文件的名称并在加载中传递它?可能具有作为"FileName“的派生列,该列将与原始数据一起加载到暂存表中。
发布于 2018-07-05 05:46:48
我在本例中使用的典型加载模式是:
TRUNCATE StagingTable;运行一个SQL (这可以清除它)我更喜欢在SQL任务中执行最后一步:
INSERT INTO FinalTable
(PrimaryKey,Column1,Column2,Column3)
SELECT
PrimaryKey,Column1,Column2,Column3
FROM StagingTable SRC
WHERE NOT EXISTS (
SELECT * FROM FinalTable TGT WHERE TGT.PrimaryKey=SRC.PrimaryKey
);如果您喜欢图形用户界面,并且不介意额外的网络流量和较慢的处理时间,则可以使用查找进行相同类型的合并操作。您甚至可以使用SCD组件,但我强烈反对它的使用。
无论是在T中还是在UI中,都需要一个键来唯一地标识记录(在我的示例中称为PrimaryKey )。如果你没有这把钥匙,就没有办法“去重复”
注意,在本例中,您有一个“真实”的暂存表,其唯一目的是将数据文件输入数据库。然后,您有一个包含最终一致结果的最终表。
还请注意,此模式只添加新行-如果现有行在数据文件中更改,它将不会更新它们。
发布于 2018-07-05 03:02:29
两年前,我在导入TSV文件时也遇到了同样的问题。我尝试了许多其他的解决方案,但我能设计的最好的是用于这种验证的C#代码脚本。
我作为解决方案所做的一切
DataTable对象,
比如:-
DataColumn[] keyColumn = new DataColumn[30];keyColumn[intJ] = dtFilterdPK.Columns["Column name"];
(TRY)..CATCH块中处理此错误代码,并根据您的日志记录要求进行此复制错误。DataTable对象中的错误记录。BulkImport Like导入到表中。使用(SqlBulkCopy bulkCopy =新SqlBulkCopy(myConnection)) { bulkCopy.DestinationTableName =“您的DB表名称”;//分配表名bulkCopy.WriteToServer(dtToBeImport);//写入实际表。}
希望这能帮到你。
发布于 2018-07-05 04:28:57
为了满足您的确切需求,我将使用上面的步骤填充表中的文件名。您甚至可以对不同的表进行规范化,而不是为每个数据记录存储长文件名。一旦数据库中有了所有的文件名,您就可以在开始时使用"Execute“来查看该文件名是否已经在数据库中了。
https://stackoverflow.com/questions/51180285
复制相似问题