如何在 SQL 中创建临时表以用于多个 ADF 活动?

Posted

技术标签:

【中文标题】如何在 SQL 中创建临时表以用于多个 ADF 活动?【英文标题】:How to create temp tables in SQL to be used in several ADF activities? 【发布时间】:2019-05-13 20:39:00 【问题描述】:

在执行 Azure 数据工厂管道时,我需要在我的 SQL Server 中创建一个全局临时表。该表将用于多个活动。

我已经尝试了几种方法,包括一种使用以sys.sp_executesql SP 为目标的存储过程活动和CREATE TABLE 语句作为参数的方法。使用这种方法实际上创建了表,但它在一秒钟后自动删除,我不明白为什么。

这是用于创建临时表的脚本:

CREATE TABLE ##tempGL
(
    GLAccount NVARCHAR(15),
    GLSubAccount NVARCHAR(15)
)

那么,如何从 Azure 数据工厂管道活动创建一个 SQL Server 临时表,该活动会一直持续到我删除它?

【问题讨论】:

你能发布你的create table 脚本吗? 临时表仅在创建它的会话期间持续存在。如果您使用sp_executesql,那么它将在您运行的(动态?)SQL 的上下文中创建,并且只要该批次完成后,临时表将被删除。您需要在使用 sp_executesql 之前创建临时表,然后它将一直持续到外部会话关闭为止。 db<>fiddle 演示。 @scsimon 我刚刚用脚本更新了问题。 我无法复制你的行为:db<>fiddle。我们在这里遗漏了一些东西。 @Larnu 是的,这个场景通常在 SQL Server 中工作,但是这一次,场景不同,因为它在 Azure 数据工厂管道中运行,所以在活动执行后有一些东西丢弃了我的表。 【参考方案1】:

我自己也一直在为此苦苦挣扎。显然这是设计使然(请参阅下面来自 Microsoft 员工的报价),即使文档提到这是可能的,使用 Azure 数据工厂也无法实现这一点。

这是设计使然。我们不会在 2 个活动之间保持联系。 如果您使用真实表而不是临时表。然后你会得到预期的结果。 如果数据需要超过 1 个活动才能访问,建议不要在 ADF 中使用临时表。

https://github.com/MicrosoftDocs/azure-docs/issues/35449#issuecomment-517451867

发生这种情况的原因是当管道活动结束时会话被删除,这导致临时表也被删除。

当创建表的会话结束并且所有其他任务都停止引用它们时,会自动删除全局临时表。任务和表之间的关联仅在单个 Transact-SQL 语句的生命周期内维护。这意味着在创建会话结束时主动引用该表的最后一个 Transact-SQL 语句完成时将删除全局临时表。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-2017#temporary-tables

希望 Microsoft 在某个时候修复此问题,并可以通过 Azure 数据工厂跨活动使用临时表。


我在 https://feedback.azure.com/forums/270578-data-factory/suggestions/38287108-persist-global-temporary-tables-between-activities987654323@https://feedback.azure.com/forums/270578-data-factory/suggestions/38287108-persist-global-temporary-tables-between-activities

对于阅读本文并可能想要他的功能的任何人,请支持该建议。

【讨论】:

以上是关于如何在 SQL 中创建临时表以用于多个 ADF 活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark sql 中创建永久表

如何在打开游标之前在存储过程中创建一个临时表?

如何从 Blob 中的 CSV 文件在 SQL 数据库中创建一个表,其中包含通过数据流或 ADF 管道的所有列名及其数据类型?

在 Azure 存储中创建文件列表并使用 ADF 将其发送到 sql 表

如何在 MySQL 中创建临时过程?

SQL如何把查询出来的多个表创建成一个临时表