数据工厂复制到临时表

时间:2020-01-08 15:53:35

标签: azure-data-factory azure-data-factory-2

我正在尝试按照MS的简单最佳实践说明进行操作,以了解如何使用数据工厂将批量数据复制到Azure sql:

Best Practice

“选项1:如果要复制大量数据,请使用以下方法进行upsert:

首先,使用临时表通过复制活动批量加载所有记录。由于不记录针对临时表的操作,因此您可以在几秒钟内加载数百万条记录。 ... 例如## UpsertTempTable,作为数据集中的表名。 “

我已按照这些说明操作,但无法复制数据。如果我使用真实表而不是临时表,那很好。实时创建表并成功导入数据

这是数据集的JSON

{
"name": "UserTempTable",
"properties": {
    "linkedServiceName": {
        "referenceName": "AzureSqlDatabase1",
        "type": "LinkedServiceReference"
    },
    "annotations": [],
    "type": "AzureSqlTable",
    "schema": [],
    "typeProperties": {
        "table": "usertemptable"
    }
},
"type": "Microsoft.DataFactory/factories/datasets"
}

如果我将“ usertemptable”替换为“ ## usertemptable”

失败

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

Data Factory不支持自动创建临时表。我们不能将“ ## usertemptable”设置为表名: enter image description here

错误

{
    "errorCode": "2200",
    "message": "ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A database operation failed. Please search error to get more details.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.InvalidOperationException,Message=Cannot access destination table '[dbo].[##temptest]'.,Source=System.Data,''Type=System.Data.SqlClient.SqlException,Message=Invalid object name '##temptest'.,Source=.Net SqlClient Data Provider,SqlErrorNumber=208,Class=16,ErrorCode=-2146232060,State=0,Errors=[{Class=16,Number=208,State=0,Message=Invalid object name '##temptest'.,},],'",
    "failureType": "UserError",
    "target": "Copy data1",
    "details": []
}

对于Azure SQL数据库,临时表位于TempDB中,但我们无法在系统数据库中查看和访问它。我们也不能在数据工厂中选择临时表作为数据集。

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

您可以引用此链接How to create temp tables in SQL to be used in several ADF activities?。它给您很多帮助和建议。

您也可以参考以下博客:Using global temporary table in copy activity not working。 Microsoft MSFT为您提供了另一种方法,您可以使用存储过程将数据插入到临时表中。

一些注意:创建临时表时不要关闭SQL连接会话。

如果这一切都不适合您,您可能需要考虑为什么坚持使用临时表,因为“复制活动”具有良好的复制数据性能。最终选择可能是使用真实表而不是临时表。

希望这会有所帮助。

答案 1 :(得分:0)

sql 中有一个新功能可用,因此可以使用表类型代替创建临时表。它也很容易实现。