ADF 将 1 到 1 从 Azure 表存储复制到 Azure SQL



我正在尝试将表从表存储精确复制到Azure SQL中。

我对源表(表存储)中的列有问题,因为它可以有多种数据类型,在我的情况下是StringDateTime。仅当检索的第一行中的列 ArrivalTime具有DateTime数据类型时,才会出现问题。据我了解,该列的数据类型由第一条记录给出。 在上面提到的情况下,我收到以下错误,因为列中的其他String值无法转换为DateTime
在其他情况下,当第一行的列具有String数据类型时,我没有任何问题,因为任何其他不同的数据类型都可以转换为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,Message=Specified cast 无效。无法存储在到达时间列中。预期类型为 DateTimeOffset,Source=System.Data,''Type=System.InvalidCastException,Message=Specified cast无效,Source=System.Data,'。

其他人遇到这种情况吗? 有没有办法绕过这个问题?

谢谢

无法存储在到达时间列中。预期类型为日期时间偏移量

是否已在表存储的日期集定义中定义了结构属性?如果未使用数据集定义中的结构属性指定数据结构,则数据工厂将使用数据中的第一行推断架构。尽管在 Azure SQL 中将数据类型更改为 nvarchar,但如果第一行中的"到达时间"数据类型为"日期时间",则源中的"到达时间"的日期类型也将被视为"日期时间"。

请将以下结构定义添加到 Azure 表存储的数据集中。

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

有关 Azure 数据工厂中的数据集的详细信息,以下链接可供参考。

Azure 数据工厂中的数据集

我已经在输入数据集和输出数据集中定义了这样的结构

很抱歉提供了错误的方向。我测试了ADF副本,然后是您的帖子,并重现了该问题。此问题与 ADF 如何从 Azure 表存储读取数据的机制有关。我还没有找到解决此问题的任何方法。

有没有办法绕过这个问题?

如果您熟悉编程,则使用 Azure Web Job 或 Azure 函数实现复制功能很容易。在 Web 作业或函数中,可以使用以下代码从 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; }
}

相关内容

  • 没有找到相关文章

最新更新