我的第一个“高级”SSIS 包存在并行性问题。
首先,这是包装的结尾:
这个包是什么:
- 从 Excel 加载数据并执行一些操作/聚合/控制
- 基于控件,它确定是否应该集成行(左分支)或不集成(右分支)
- 如果没问题,则执行一些计算,添加行并写入一些统计信息(这是左分支的 OLE DB 命令)
- 如果该行被拒绝,则将其添加到拒绝文件中,并在日志中写入一些统计信息(右侧分支的 OLE DB 命令)
每个文件加载只生成一个日志行,因此成功和失败日志信息写入同一行(由执行 guid 和导入的文件名标识,因为它可以在同一执行期间导入多个文件),但填充的列不一样.
两个 OLE DB 命令调用相同的存储过程:
- 检查行是否存在
- 如果不存在,则添加一个新行
- 否则它会更新正确的列
在有人提出问题之前,这工作得很好:有时执行会生成 2 行:一行包含成功信息,另一行包含被拒绝的信息。
经过分析,我注意到可能会同时执行两个 OLE DB 命令,因此两者都看不到现有行并都插入了新行。
我想知道是否有办法阻止 OLE DB 命令同时执行。性能在这里不是问题,所以我不在乎它是否会产生更高的执行时间。
我看到的唯一解决方案是在表上添加一个唯一约束并捕获错误,但我不确定这是一个真正“优雅”的解决方案(我不喜欢复制 UPDATE 语句的想法,即“正常”一个和“异常”之一)所以我正在寻找一种不涉及捕获异常的解决方案!
当然,如果没有更好的解决方案,我想我会这样做。