Фабрика данных Копировать во временную таблицу - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь следовать простым рекомендациям от MS по копированию больших объемов данных в azure sql с использованием фабрики данных:

Наилучшая практика

"Вариант 1. Если у вас есть большой объем данных для копирования, используйте следующий подход для выполнения восстановления:

Сначала используйте временную таблицу для массовой загрузки всех записей с помощью операции копирования. Поскольку операции с временными таблицами не регистрируются, вы можете загрузить миллионы записей в считанные секунды ... ... например, ## UpsertTempTable в качестве имени таблицы в наборе данных. "

Я следовал этим инструкциям и не удается скопировать данные. Если я использую реальную таблицу, а не временную таблицу, это нормально. Реальная таблица создается на лету, и данные успешно импортируются

Вот набор JSON для набора данных

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

Если я заменим "usertemptable" на "## usertemptable"

не получается

Есть идеи?

1 Ответ

2 голосов
/ 09 января 2020

Фабрика данных не поддерживает автоматическое создание временной таблицы. Мы не можем установить "## 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, который активно ссылался на таблицу после завершения сеанса создания.

Вы можете сослаться на эту ссылку Как создать временные таблицы в SQL для использования в нескольких операциях ADF? . Это дает вам много подсказок и предложений.

Вы также можете сослаться на этот блог: Использование глобальной временной таблицы в операции копирования не работает . Microsoft MSFT предоставляет еще один способ вставки данных во временную таблицу с помощью хранимой процедуры.

Некоторые замечания: не закрывайте сеанс подключения SQL при создании временной таблицы.

Если все это не работает для вас, вам может понадобиться подумать о том, почему вы настаиваете на использовании временной таблицы, поскольку Copy Active имеет хорошую производительность для копирования данных. Окончательный выбор может состоять в том, чтобы использовать реальную таблицу, а не временную таблицу.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...