![](/img/trans.png)
[英]Create list of files in Azure Storage and send it to sql table using ADF
[英]ADF Copy 1 to 1 from Azure Table Storage to Azure SQL
我試圖將表存儲的精確副本復制到Azure SQL中 。
我對源表(表存儲)中的列有問題,因為它可以有多種數據類型,例如我的String
或DateTime
。 僅當從第一行檢索到的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數據工廠中數據集的更多信息,下面的鏈接供您參考。
我已經在輸入數據集和輸出數據集中定義了這樣的結構
很抱歉提供錯誤的方向。 我先測試了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.