【问题标题】: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】:
我会这样做:
(最后三个步骤都将在同一个存储过程中完成)。
【讨论】:
-
SQL Server 的MERGE 语句可以非常方便地进行从暂存到目标的合并。