簡體   English   中英

ADF將1到1從Azure表存儲復制到Azure SQL

[英]ADF Copy 1 to 1 from Azure Table Storage to Azure SQL

我試圖將表存儲的精確副本復制到Azure SQL中

我對源表(表存儲)中的列有問題,因為它可以有多種數據類型,例如我的StringDateTime 僅當從第一行檢索到的ArrivalTime列具有DateTime數據類型時,才會出現此問題。 據我了解,列的數據類型由第一條記錄給出。 在上述情況下,由於無法將column中的其他String值轉換為DateTime ,因此出現以下錯誤。
在其他情況下,當從第一行檢索的列具有String類型時,我沒有任何問題,因為可以將任何其他不同的數據類型轉換為String

AzureSql的目標列設置為nvarchar,因此這不是問題。 發生錯誤源端

Copy activity encountered a user error at Source side:

錯誤信息:

ErrorCode = UserErrorInvalidDataValue,'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message =列'ArrivalTime'包含無效值'DateTime.Null'。,Source = Microsoft.DataTransfer.Common,''Type = System.ArgumentException,消息=指定的強制類型轉換無效。無法存儲在ArrivalTime列中。 預期類型為DateTimeOffset。,Source = System.Data,''Type = System.InvalidCastException,Message =指定的類型轉換無效。,Source = System.Data,'。

有人遇到過這種情況嗎? 有什么辦法可以繞過這個問題?

謝謝

無法存儲在ArrivalTime列中。 預期的類型為DateTimeOffset

您是否在表存儲的日期集定義中定義了結構屬性? 如果您未通過使用數據集定義中的structure屬性來指定數據結構,則Data Factory將使用數據中的第一行來推斷模式。 盡管在Azure SQL中將數據類型更改為nvarchar,但如果第一行中ArrivalTime的數據類型為DateTime,則源中ArrivalTime的日期類型也將被視為DateTime。

請向Azure表存儲的數據集中添加以下結構定義。

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

有關Azure數據工廠中數據集的更多信息,下面的鏈接供您參考。

Azure數據工廠中的數據集

我已經在輸入數據集和輸出數據集中定義了這樣的結構

很抱歉提供錯誤的方向。 我先測試了ADF復制,然后又測試了您的帖子,然后重現了該問題。 該問題與ADF如何從Azure表存儲讀取數據的機制有關。 我還沒有找到解決此問題的任何方法。

有什么辦法可以繞過這個問題?

如果您熟悉編程,則可以使用Azure WebJob或Azure Function輕松實現復制功能。 在WebJob或Function中,可以使用以下代碼從Azure表存儲讀取數據並將數據寫入Azure SQL。

// 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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM