我正在尝试按照MS的简单最佳实践说明进行操作,以了解如何使用数据工厂将批量数据复制到Azure sql:
“选项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”
失败
有什么想法吗?
答案 0 :(得分:3)
Data Factory不支持自动创建临时表。我们不能将“ ## usertemptable”设置为表名:
错误:
{
"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 中有一个新功能可用,因此可以使用表类型代替创建临时表。它也很容易实现。