【问题标题】:Do I lose my temporary tables when changing tasks in an SSIS package?更改 SSIS 包中的任务时是否会丢失临时表?
【发布时间】:2014-08-28 21:43:18
【问题描述】:

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

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

【问题讨论】:

  • 查找任务让您检查行是否已经存在。但我认为数据库方法是一种更好的方法。我不能告诉你临时表是否会在下一个任务中消失,但如果你有这个选项,我建议你使用永久表而不是临时表。

标签: sql-server sql-server-2008 ssis


【解决方案1】:

在您的连接管理器中,您需要设置 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 命令,如果条件为 Existing,它将更新目标表。

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

【讨论】:

  • 我实际上最终这样做了,而且效果很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多