更改 SSIS 包中的任务时我会丢失临时表吗?

问题描述 投票:0回答:3

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

我知道本地和全局临时表当它们超出范围时就会消失。所以,我的问题是,当我的 SSIS 包继续执行下一个任务时,我的临时表会消失吗?

sql-server sql-server-2008 ssis
3个回答
2
投票

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

您还需要为许多任务设置 DelayValidation = True(如果没有看到您的包,我无法告诉您所有任务,但您可以进行实验)。默认情况下,SSIS 会在执行之前尝试预先验证包中的所有步骤。当您使用临时表时,如果临时表不存在,则此预验证将失败。通过设置 DelayValidation = True,您可以避免预验证。

最后,您可能需要做一些奇怪的事情才能让包在设计时识别您的临时表 - 例如执行创建临时表的任务,然后尝试映射您的字段(假设您将遵循良好实践并将临时表放在包的末尾)。

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

您应该能够使用全局或本地临时表来完成此任务。


2
投票

您需要的是包中的 2 个 oledb 源。一张用于 oracle 表,一张用于目标表。然后对每个源进行排序,并在 2 个源的键上添加合并联接。在合并联接中,您执行左外联接,然后添加条件拆分。有条件的分割会有“现有”和“新”

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

从条件拆分中,您有一个 oledb sql 命令,如果条件为“现有”,它将更新目标表。

从条件拆分中,您有一个 oledb 目标,它将成为目标表,并且如果条件为“新建”,则会向其中添加新行。


0
投票

如果您关心设置和设置,您就不会丢失临时表:

在带有附加 DFT 的控制流中传递临时表

如果想通过“执行SQL任务”的方式在控制流中创建临时表,请参阅如何在SSIS控制流任务中创建临时表,然后在数据流任务中使用它?

请注意,在 DFT 中,在第一个项目占用临时表之后,您将丢失临时表,因为该连接不是所需的 ADO.NET 连接。因此,如果您想在 DFT 中将其进一步向下传递,则需要遵循有关在 DFT 内部传递它的下一个要点,即,您需要在顶部有一个新的 ADO.NET 连接,并且必须使用脚本组件以保持临时表处于活动状态。但是,如果您仅在一个 DFT 步骤中使用临时表,即从数据源获取数据并将其填充到数据目标中的临时表中,则它将不会被删除,并且您将不需要下一个项目符号点。

在 DFT 中传递临时表

如果您想在数据流任务中创建并传递临时表,请参阅DFT 在保留任何 DFT 项后删除连接及其临时表,使用两个脚本组件进行测试。如何使临时表保持活动状态?.

© www.soinside.com 2019 - 2024. All rights reserved.