0

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

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

这个包是什么:

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

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

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

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

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

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

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

4

2 回答 2

3

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

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

于 2011-11-16T12:33:37.130 回答
1

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

于 2011-11-16T13:23:17.527 回答