在 SSIS 包中使用临时表

Posted

技术标签:

【中文标题】在 SSIS 包中使用临时表【英文标题】:Use temp tables in SSIS packages 【发布时间】:2011-10-28 07:52:46 【问题描述】:

我正在编写从一个数据库到另一个数据库的基本文件转储。我正在使用 SSIS 2008 并创建几个包来将我拥有的数据从 MSSQL 2010 数据库转换为 mysql 5.1 数据库。

所有连接都已建立,记录可以在两个数据库之间传输,但我想在转换过程中使用临时表,并将临时表用作数据流任务中的 MSSQL 源,以便在等待中转储表MYSQL 表。

我在设置时遇到了问题。我正在使用 OLEDB 连接并将 RetainSameConnection 属性以及 DelayValidation 属性设置为 true。将源图设置为 MSSQL 数据库的源时,我无法从控制流中找到我在早期任务中创建的临时表。我对这两个任务使用相同的连接管理器。

有人对此有任何想法或经验吗?

作为一个简单的例子,一个任务可以完成..

SELECT * 
INTO #TMP
FROM CUSTOMERS

(这是一个简化的示例,我认为在这种情况下我可以只使用客户表,所以请耐心等待) 是否可以在数据流操作中将此临时表用作源表?

【问题讨论】:

SSIS 在使用临时表方面变得特别笨拙,因为它试图将模式绑定到您设置的任务和数据流中。如果有解决方案,我还没有找到。我们使用 SSIS 模式来保存临时表等来解决这个问题。 您能否添加一个解决方案来解决这项工作的细节问题? 【参考方案1】:

正如我在评论中提到的,解决方案不多,解决方法更多。 SSIS 使用结果集的形状来绑定任务中的属性。由于数据库中的临时表并不总是可用,即使您将 DelayValidation 设置为 true,这也可能导致 SSIS 中的错误。

我的解决方案是在您要连接的任何数据库中创建一个SSIS 架构。这样做的原因是安全性和明确分离仅在 SSIS 包中使用的对象 - 主要是临时表。

与其在dbo 架构中扔表(反正你不应该这样,真丢脸),不如在SSIS 架构中创建它们。典型的数据流会在开始时截断表,加载值并执行所需的任何操作,完成时可选择截断它。只要表始终可用,SSIS 就可以检查结果集的形状。

【讨论】:

【参考方案2】:

您不应使用临时表作为源,因为它无法识别用于选择的列。请改用表变量或 CTE。

【讨论】:

如果声明了表变量或 CTE,它是否会显示为可供选择的表? @JBone,加入它的选择不会被 SSIS 识别为源数据。

以上是关于在 SSIS 包中使用临时表的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 临时临时表

在SSIS中的不同组件间使用局部临时表

SSIS 包不想获取临时表的元数据

如何在 SSIS 控制流任务中创建一个临时表,然后在数据流任务中使用它?

SSIS - 将Excel与数据库进行比较

什么是临时表?