在 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 包中使用临时表的主要内容,如果未能解决你的问题,请参考以下文章