2014-08-28 28 views
1

我在写一个从Oracle数据库导入数据的SSIS包。有可能有一些行已经在目标表中,并且看到SSIS 2008中没有任何任务允许我检查这一点,我的想法是创建一个临时表并在目标表中使用一个字段来过滤临时表的行我可以实际插入。在SSIS包中更改任务时是否会丢失临时表?

我明白,本地和全球临时表vanish when they go out of scope。所以,我的问题是,当我的SSIS包继续下一个任务时,我的临时表会消失吗?

+0

查找任务让您检查行是否已经存在。但我认为数据库方法是一个更好的方法。我不能告诉你临时表是否会消失,但我建议你使用永久表而不是临时表,如果你有这个选项的话。 – 2014-08-28 22:41:33

回答

1

在您的连接管理器中,您需要设置RetainSameConnection = True。这可以确保您的连接在整个包的执行过程中不会关闭 - 使用相同的spid。

你还需要为许多任务设置DelayValidation = True(没有看到你的包,我不能告诉你所有这些,但你可以试验)。默认情况下,SSIS会在执行前尝试预先验证包中的所有步骤。在使用临时表时,如果临时表不存在,则此预验证将失败。通过设置DelayValidation = True,可以避免预验证。最后,你可能需要做一些奇怪的事情来让包在设计时识别你的临时表 - 例如,执行创建临时表的任务,然后尝试映射您的字段(假设您要遵循良好实践并将临时表放在包的末尾)。

本文提供了一个很好的概述:http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/

你应该能够与全局或局部临时表来实现这一目标。

+0

不能比这更清楚,谢谢。我实际上最终跟随了罗伯特的建议,但我认为这是问题的答案。 – 2014-09-01 13:50:26

1

你需要的是2包中的oledb源代码。一个用于oracle表,另一个用于目标表。然后你对它们进行排序并在这两个源的键上添加一个合并连接。在合并连接中,执行左外连接,然后添加条件分割。条件拆分将具有“现有”和“新”

现有条件将是!IsNull(DestTableID)。新条件将是IsNull(DestTableID)。

从条件分割,您有一个oledb sql命令,如果条件是Existing,它将更新目标表。

从条件拆分中,您有一个oledb目标,它将成为目标表,如果条件为New,它将向其添加新行。

+0

我实际上已经完成了这个工作,并且工作完美。谢谢。 – 2014-09-01 13:51:23