忽略SSIS中的重复记录' OLE DB目标

时间:2015-12-14 16:07:19

标签: sql-server ssis sql-server-2012 ssis-2012

我使用OLE DB目标来填充来自Web服务的值的表。

该套餐将安排在上午早些时候在前一天的活动中运行。但是,如果失败,则可以手动执行包。

我担心的是,如果操作员选择覆盖现有数据的日期范围,整个包将失败(已验证)。

我想要它:

  • INSERT缺少值(如果没有重复,则按预期工作)
  • 忽略重复;不要导致包裹失败;引发可由Windows应用程序日志捕获的异常(记录为警告)
  • 收集成功插入记录的数量和重复数量

如果重要,我使用Data access mode = Table or view - fast load

enter image description here

有关如何实现这一目标的建议表示赞赏。

2 个答案:

答案 0 :(得分:3)

这不是一个功能。

如果你不想要错误(重复),那么你需要防御它 - 就像你用自己喜欢的语言做的那样。您不是依赖于错误处理,而是测试是否存在错误诱导的事物(查找转换以识别目标中存在的行),然后过滤掉重复项(重定向无匹配输出)。

绝对不应该实施的技术解决方案

将访问模式从“表格或视图名称 - 快速加载”更改为“表格或视图名称”。这会将插入方法从基于批量/基于集的操作更改为单例插入。通过一次插入一行,这将允许SSIS包评估每行保存的成功/失败。您然后需要进入高级编辑器,屏幕截图,并将错误处置从失败组件更改为Ignore Failure

不应使用此解决方案,因为它会导致性能不佳,产生不必要的工作负载,并且有可能掩盖其他保存错误,而不仅仅是“重复” - 例如参考完整性违规

答案 1 :(得分:0)

我将如何做到这一点:

  • 将您的SSIS目标指向一个空的临时表 当包裹运行时。

  • 将所有行插入临时表。

  • 运行使用SQL从中导入记录的存储过程 staging table到最终目标表,WHERE记录没有 已经存在于目的地表中。

  • 收集所需的元数据并随意使用它。

  • 清空临时表以供下次使用。

(最后3个步骤都将在同一个存储过程中完成)。