【问题标题】:I don't use temp table in SSIS我不在 SSIS 中使用临时表
【发布时间】:2021-11-28 23:47:23
【问题描述】:

我在 SSIS 中使用 OLE-DB Source 临时表时遇到问题。

我在 Execute T-SQL Statement Task 中创建临时表并更改 DelayValidation : True 和 RetainSameConnection : True 。但是问题没有解决。

【问题讨论】:

    标签: ssis etl ssis-projects


    【解决方案1】:

    背景

    这里可能发生的情况是该表目前不存在。临时表有两种变体:本地和全局。

    一个本地临时表,使用一个名称,前面带有一个单一的Sharp/pound/hash/octothorpe,即#TEMP。唯一可以使用该临时表实例的查询是创建它的查询。这就是为什么互联网上的建议说您需要将 RetainSameConnection 设置为 true 以确保在数据流中重用创建表的连接。否则,您将受到连接池的摆布,并且可能在两个地方都使用相同的连接,也许不会,相信我,尝试和调试是一种令人不快的随机性。数据流上出现DelayValidation 的原因是,当包启动时,引擎将在执行任何工作之前验证所有数据是否符合预期。由于前导步骤是使数据流任务进入预期状态的步骤,我们需要告诉执行仅在执行前立即验证任务。验证总是会发生,只是您何时支付价格的问题。

    全局临时表的定义是在其前面添加一个双尖/etc 符号##TEMP。任何进程都可以访问它,而不仅仅是创建它的连接。它将一直存在,直到创建连接消失(或明确删除它)。

    分辨率

    一旦设计了包(元数据在数据流中建立),使用本地临时表就可以正常工作了。但是,在开发它时,不可能将本地临时表用作数据流中的源。如果您执行前导步骤,该连接将打开,创建临时表,然后连接像临时表一样消失。

    我将通过以下步骤解决此问题

    1. 将 Execute SQL Task 中的查询复制到 SSMS 的窗口中,并将本地临时表创建为全局临时表,即 ##TEMP
    2. 创建一个名为 SourceQuery 的 SSIS 变量,类型为 String,值为 SELECT * FROM ##TEMP;
    3. 将 OLE DB 源中的“数据访问模式”从“SQL 命令”修改为“来自变量的 SQL 命令”,并使用变量User::SourceQuery
    4. 完成数据流的设计
    5. 保存包以确保元数据被持久化
    6. 将变量中的查询从引用##TEMP 更改为#TEMP
    7. 再次保存。
    8. 删除##TEMP 表或关闭连接
    9. 运行包以确保一切正常。

    上面的步骤 2、3 和 6 可以让您模拟魔术师从所有盘子下面拉出桌布。

    如果您要在数据流本身中手动编辑从 ##TEMP 到 #TEMP 的查询,则会触发验证,并且由于没有可用的 #TEMP 表,它会报告 VS_NEEDSNEWMETADATA 并且可能不会让您保存包裹。使用变量作为查询源提供了一定程度的间接性,可以让我们绕过“更改时验证”/重新初始化元数据步骤。

    【讨论】:

    • 非常感谢,不胜感激。我创建了一个##temp 表,进行了映射,然后删除了##temp 表并运行了该过程。
    • 使用全局临时表有什么坏处吗?我问是因为无论全局还是本地,您仍然需要在连接管理器上设置保持与 True 相同的连接。
    • @variable 全局临时表的风险在于外部进程可能与您的数据交互。另一个风险是您在您的环境中使用复制/粘贴编码,有人也可能创建 ##TEMP 并且您的进程尝试创建它并出错。所以,选择好名字。我确信使用全局临时表和本地临时表还有其他注意事项,但它们超出了我的关注范围
    猜你喜欢
    • 2023-03-11
    • 2011-10-28
    • 1970-01-01
    • 2023-04-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多