【问题标题】:Ignore duplicate records in SSIS' OLE DB destination忽略 SSIS 的 OLE DB 目标中的重复记录
【发布时间】:2015-12-14 16:07:19
【问题描述】:

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

该程序包将安排在前一天活动的凌晨运行。但是,如果失败,可以手动执行该包。

我担心的是,如果运营商选择的日期范围与现有数据重叠,整个包将失败(已验证)。

我想要:

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

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

感谢您就如何实现这一目标提出建议。

【问题讨论】:

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


    【解决方案1】:

    这不是一个功能。

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

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

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

    不应使用此解决方案,因为它会产生较差的性能,产生不必要的工作量,并有可能掩盖“重复”之外的其他保存错误 - 例如违反引用完整性

    【讨论】:

      【解决方案2】:

      我会这样做:

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

      • 将所有行插入临时表。

      • 运行一个存储过程,该过程使用 SQL 从 暂存表到最终目标表,其中记录不 目标表中已存在。

      • 收集所需的元数据并用它做任何你想做的事情。

      • 清空暂存表以备下次使用。

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

      【讨论】:

      • SQL Server 的MERGE 语句可以非常方便地进行从暂存到目标的合并。
      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多