我正在编写一个从Oracle数据库导入数据的SSIS包。目标表中已经有一些行已经存在,并且看到SSIS 2008中没有任务允许我检查这个,我的想法是创建一个临时表并在目的地中使用一个字段用于过滤临时表的实际插入行的表。
我理解本地和全球临时表vanish when they go out of scope。所以,我的问题是,当我的SSIS包继续下一个任务时,我的临时表会消失吗?
答案 0 :(得分:1)
您需要的是包装中的2个oledb来源。一个用于oracle表,一个用于目标表。然后对每个源进行排序,并在2个源的键上添加合并连接。在合并连接中,执行左外连接,然后添加条件拆分。条件拆分将具有“现有”和“新”
现有条件将是!IsNull(DestTableID)。新条件将是IsNull(DestTableID)。
从条件拆分中,您有一个oledb sql命令,如果条件为Existing,它将更新destingation表。
从条件拆分中,您有一个oledb目标,它将是目标表,如果条件为New,则会向其添加新行。
答案 1 :(得分:1)
在您的连接管理器中,您需要设置RetainSameConnection = True。这可确保您的连接在整个程序包执行期间不会关闭 - 使用相同的spid。
你还需要为你的许多任务设置DelayValidation = True(没有看到你的包,我不能告诉你所有的,但你可以试验)。默认情况下,SSIS会在执行前尝试预先验证程序包中的所有步骤。当您使用临时表时,如果临时表不存在,则此预验证将失败。通过设置DelayValidation = True,您可以避免预验证。
最后,你可能需要做一些奇怪的事情来让包在设计时识别你的临时表 - 例如执行创建临时表的任务,然后尝试映射您的字段(假设您将遵循良好实践并将临时表放在包的末尾)。
本文提供了一个很好的概述:http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/
您应该能够使用全局或本地临时表来完成此操作。