ADF Copy 1 to 1 из хранилища таблиц Azure в Azure SQL

Я пытаюсь сделать точную копию таблицы из хранилища таблиц в Azure SQL.

У меня проблема со столбцом из исходной таблицы (хранилище таблиц), потому что он может иметь несколько типов данных, в моем случае String или DateTime. Проблема возникает только тогда, когда столбец ArrivalTime из первой полученной строки имеет DateTime тип данных. Как я понял, тип данных столбца задается первой записью. Я получаю приведенную ниже ошибку только в упомянутом выше случае, потому что другие значения String из столбца не могут быть связаны с DateTime.
В других случаях, когда извлеченный столбец из первой строки имеет String DataType, у меня нет никаких проблем, так как любой другие типы данных могут быть преобразованы в String.

Столбец назначения из AzureSql имеет значение nvarchar, поэтому это не проблема. Ошибка возникает на стороне источника

Copy activity encountered a user error at Source side:

Сообщение об ошибке:

ErrorCode = UserErrorInvalidDataValue, 'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException, Message = Column' ArrivalTime 'содержит недопустимое значение' DateTime.Null '., Source = Microsoft.DataTransfer.Common,' 'Type = System.ArgumentException, Сообщение = Указанное приведение неверно. Не удалось сохранить в столбце ArrivalTime. Ожидаемый тип: DateTimeOffset., Source = System.Data, '' Type = System.InvalidCastException, Message = Specified cast is not valid., Source = System.Data, '.

Кто-нибудь еще сталкивался с этой ситуацией? Есть ли способ обойти эту проблему?

Спасибо


person cbi    schedule 06.04.2017    source источник


Ответы (1)


Не удалось сохранить в столбце ArrivalTime. Ожидаемый тип - DateTimeOffset

Вы определили свойство структуры в определении набора дат для своего хранилища таблиц? Если вы не указали структуру данных с помощью свойства структуры в определении набора данных, фабрика данных определяет схему, используя первую строку данных. Хотя вы изменили тип данных на nvarchar в Azure SQL, тип даты ArrivalTime из источника также будет обрабатываться как DateTime, если тип данных ArrivalTime в первой строке - DateTime.

Добавьте следующее определение структуры в набор данных хранилища таблиц Azure.

structure:  
[
    { "name": " ArrivalTime ", "type": "String"}
]

Для получения дополнительных сведений о наборах данных в фабрике данных Azure перейдите по ссылке ниже для справки.

Наборы данных в фабрике данных Azure

Я уже определил такую ​​структуру во входном наборе данных, а также в выходном наборе данных.

Извините за неверное направление. Я протестировал копию ADF, за которой последовал ваш пост, и воспроизвел проблему. Проблема связана с механизмом чтения данных ADF из хранилища таблиц Azure. Я не нашел способов исправить эту проблему.

Есть ли способ обойти эту проблему?

Если вы знакомы с программированием, легко реализовать функцию копирования с помощью веб-задания Azure или функции Azure. В веб-задании или функции вы можете читать данные из хранилища таблиц Azure и записывать данные в SQL Azure, используя следующий код.

// Parse the connection string and return a reference to the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("Azure Storage Connection String");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Retrieve a reference to the table.
CloudTable table = tableClient.GetTableReference("table name");

TableQuery<MyTableEntity> query = new TableQuery<MyTableEntity>();
// Loop all the entities of Azure Table and insert into Azure SQL
foreach (MyTableEntity entity in table.ExecuteQuery(query))
{
    using (SqlConnection connection = new SqlConnection("connection string of azure sql"))
    {
        SqlCommand cmd = new SqlCommand("insert into tables (ArrivalTime) values (@ArrivalTime) ", connection);
        cmd.Parameters.AddWithValue("ArrivalTime", entity.ArrivalTime);
        connection.Open();
        cmd.ExecuteNonQuery();
    }
}
public class MyTableEntity : TableEntity
{
    public MyTableEntity(string pkey, string rkey)
    {
        this.PartitionKey = pkey;
        this.RowKey = rkey;
    }

    public MyTableEntity() { }

    public string PKey { get; set; }

    public string RKey { get; set; }

    public string ArrivalTime { get; set; }
}
person Amor    schedule 07.04.2017
comment
Я уже определил подобную структуру во входном наборе данных, а также в выходном наборе данных { "name": "ArrivalTime", "type": "String" }, Кроме этого, я также определил табличный транслятор в конвейере. - person cbi; 07.04.2017
comment
Я протестировал, отредактировав код Json в таблице Azure с атрибутом структуры, но все еще не работал. Они автоматически удалили атрибут, когда я нажал кнопку «Готово». - person Tấn Nguyên; 15.08.2019