在 SSIS 流中使用临时表失败

2024-05-07

我有一个 ETL 过程,可将约 40 个表从源数据库 (Oracle 10g) 提取到 SQL Server(2014 开发人员版)临时环境。我的提取过程:

  1. 确定暂存中的最新行
  2. 从源中选择所有较新的行
  3. 将结果插入#TEMPTABLE
  4. 将 #TEMPTABLE 的结果合并到 Staging

这可以在本地 Visual Studio 中逐个包地运行,也可以从 SQL Server 上的 SSISDB 执行。

不过,我将提取作业分组到一个主包中,以便于执行并流向转换阶段。我的包中只有大约 5 个使用临时表,其他的都是 trunc 和 load,但想将更多内容移至此方法。当我运行主包时,使用临时表的任何内容都会失败。由于日志文件相当大,很难查明实际错误,但到目前为止,它告诉我的是找不到 #TEMPTABLE 和/或状态为 VS_ISBROKEN。

我尝试过的事情:

  1. 将所有相关组件设置为delay validation = false
  2. 主包有ExecuteOutOfProcess = true
  3. 增加了我的 tempdb 容量,远远超出了我的需求

我的一个想法是RetainSameConnection = true在我的临时数据库连接上 - 这可能是原因吗?我会尝试为每个创建单独的连接,但假设ExecuteOutOfProcess会帮我处理这件事。


EDIT

我创建了以下场景:

  • Package A (Master package containing Execute Package Task references only)
    • 包 B(使用临时表)
    • 套餐 C(无临时表)

自行执行包 B 已成功完成。所有临时表的使用都包含在该包中 - 包 C 不需要查看包 B 创建的临时表。

执行包 C 成功完成。

执行包 A、C 成功完成,B 失败。


UPDATE

解决方法是为每个使用临时表的包创建包级连接,从而确保每个包拥有自己的连接。我向 Microsoft 提出了一个连接问题,因为我相信当父包打开连接时,它应该在所有子包中继承和保留。


针对您的情况提出几点建议。

  1. Set RetainSameConnection=true。这将使您能够安全地使用 SSIS 包中的 TEMP 表。
  2. 不会使用进程外执行,它会增加您的 RAM 占用空间,因为每个子包都会在其进程中启动,并降低性能 - 增加进程启动延迟。这在 32 位环境中用于克服 2 GB 限制,但在 x64 上不再需要。
    子包执行不会从其父包继承连接对象实例,因此同一连接不会跨越所有子包。
  3. 带有临时表操作的SSIS包调试起来比较困难(不太明显),所以要注意测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SSIS 流中使用临时表失败 的相关文章

随机推荐