首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SSIS包,如何在插入之前验证源记录是否重复?

使用SSIS包,如何在插入之前验证源记录是否重复?
EN

Stack Overflow用户
提问于 2018-07-04 20:12:59
回答 3查看 2.1K关注 0票数 1

Server 2012:使用SSIS包,如何在插入之前验证源记录是否重复?

我们的源文件是一个.csv。我们正面临加载在暂存表中的重复记录。

目前,我们正在采用手工加载数据的过程。

如何在加载和仅加载有效记录之前根据目标表验证源文件数据?加载重复记录的可能性不仅是因为源文件中有重复记录,而且还因为将同一文件重新加载到暂存表中。

我们不会截断暂存表。我们正在按原样记录。

第二个问题:如何选择源文件的名称并在加载中传递它?可能具有作为"FileName“的派生列,该列将与原始数据一起加载到暂存表中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-05 05:46:48

我在本例中使用的典型加载模式是:

  1. 准备一个与源文件匹配的暂存表。
  2. 在SSIS中,使用TRUNCATE StagingTable;运行一个SQL (这可以清除它)
  3. 然后,运行数据流任务,将整个数据文件加载到暂存表中。
  4. 最后,将暂存表合并到最后一个表中。

我更喜欢在SQL任务中执行最后一步:

代码语言:javascript
运行
复制
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 )。如果你没有这把钥匙,就没有办法“去重复”

注意,在本例中,您有一个“真实”的暂存表,其唯一目的是将数据文件输入数据库。然后,您有一个包含最终一致结果的最终表。

还请注意,此模式只添加新行-如果现有行在数据文件中更改,它将不会更新它们。

票数 2
EN

Stack Overflow用户

发布于 2018-07-05 03:02:29

两年前,我在导入TSV文件时也遇到了同样的问题。我尝试了许多其他的解决方案,但我能设计的最好的是用于这种验证的C#代码脚本。

我作为解决方案所做的一切

  • 使用C#在内存中创建一个DataTable对象, 比如:-

DataColumn[] keyColumn = new DataColumn[30]; keyColumn[intJ] = dtFilterdPK.Columns["Column name"]

  • 然后尝试一个接一个地从您的CSV添加到这个DataTables。
  • 每当您的数据得到基于主键的复制时,就会有一个错误
  • (TRY)..CATCH块中处理此错误代码,并根据您的日志记录要求进行此复制错误。
  • 避免导入DataTable对象中的错误记录。
  • 最后,将CSV文件作为BulkImport Like导入到表中。

使用(SqlBulkCopy bulkCopy =新SqlBulkCopy(myConnection)) { bulkCopy.DestinationTableName =“您的DB表名称”;//分配表名bulkCopy.WriteToServer(dtToBeImport);//写入实际表。}

希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2018-07-05 04:28:57

  1. 考虑到您的确切场景(再次加载相同的文件),我将首先检查数据是否已加载到暂存表。如果这样做,您就不必担心在记录级别上检查副本。
  2. 如何设置与文件的连接?我处理过的大多数数据负载,都是为每个循环容器设计的,其中文件名/路径将被填充到用户变量中。如前所述,您只需使用派生列转换来添加从变量中获取值的新列。如果用户变量中没有文件名,则可以使用控制流中的表达式任务来填充它。

为了满足您的确切需求,我将使用上面的步骤填充表中的文件名。您甚至可以对不同的表进行规范化,而不是为每个数据记录存储长文件名。一旦数据库中有了所有的文件名,您就可以在开始时使用"Execute“来查看该文件名是否已经在数据库中了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51180285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档