防止在SSIS中执行并行OLE DB命令

时间:2011-11-16 12:29:26

标签: sql-server ssis oledbcommand

我的第一个“高级”SSIS包存在并行问题。

首先,这是包的结尾: SSIS Package

这个包裹是什么:

  • 从Excel加载数据并执行一些操作/聚合/控制
  • 基于控件,它确定是否应该集成行(左分支)或不集成(右分支)
  • 如果没问题,会执行一些计算,添加行并写入带有一些统计信息的日志(这是左侧分支的OLE DB命令)
  • 如果该行被拒绝,则会将其添加到拒绝文件中,并使用某些统计信息写入日志(右侧分支的OLE DB命令)

每个文件加载只生成一个日志行,因此成功和失败日志信息写在同一行(由执行guid和导入的文件名标识,因为它可以在同一执行期间导入多个文件),但填充的列是不一样。

两个OLE DB命令都调用相同的存储过程:

  • 检查行是否存在
  • 如果它不存在,则会添加新行
  • 否则会更新正确的列

在有人提出问题之前,这很有效:有时执行会生成2行:一行包含成功信息,另一行包含被拒绝的行。
在分析之后,我注意到可能同时执行两个OLE DB命令,因此两者都看不到现有行并且都插入一个新行。

我想知道是否有办法阻止OLE DB命令同时执行。性能在这里不是问题,因此我不关心它是否会产生更高的执行时间。

我看到的唯一解决方案是在表上添加一个唯一约束并捕获错误但我不确定这是一个非常“优雅”的解决方案(我不喜欢重复UPDATE语句的想法,“正常的“一个和”例外“一个”所以我正在寻找一个不涉及捕获异常的解决方案!
当然,如果没有更好的解决方案,我想我会这样做。

2 个答案:

答案 0 :(得分:3)

您应该能够将两个日志路径合并为一个写操作。不幸的是,这意味着需要对它们进行排序:http://msdn.microsoft.com/en-us/library/ms141703.aspx

请注意,像这样反复调用OLEDBCommand对于大型操作来说并不是一个好主意 - 有时将所有数据放入临时表然后使用单个命令来执行操作要好得多。

答案 1 :(得分:1)

由于您在OLEDB命令中使用存储过程,因此您只需使用联合。那样你就不用排序了。 OLEDB命令将为每一行处理一次。