【发布时间】:2022-01-26 08:29:11
【问题描述】:
我正在尝试使用 Azure 数据工厂将数据从 cosmosdb 容器复制到 Azure SQL 数据库表。 我在 cosmosdb 中的某些列不是强制性的,可能未定义。问题是对于这些列中的每一列,我在运行复制活动时都会收到以下错误:
Data type of column 'MyProperty' can't be inferred from 1st row of data, please specify its data type in mappings of copy activity or structure of DataSet.
但是,我在映射选项卡中进行了检查,这些属性的类型被正确推断为字符串,并且它们在我的 SQL 存储过程表类型中可以为空。
对于可选的十进制属性,我也有同样的问题,错误表明该值无法解析为 Int64,尽管映射选项卡中的推断类型设置为数字而不是整数...
和表类型的存储过程
CREATE TYPE [dbo].[MyTableType] AS TABLE
(
[Id] varchar(256) NOT NULL PRIMARY KEY,
[SupplierId] varchar(256) NOT NULL,
[SupplierClientId] varchar(256) NULL,
[BuyerId] varchar(256) null
)
CREATE PROCEDURE [dbo].[UpsertItems]
@itemsTable MyTableType readonly
AS
BEGIN
MERGE MyTable AS target
USING @itemsTable AS source
ON (target.Id = source.Id)
WHEN MATCHED THEN
UPDATE SET
SupplierId = source.SupplierId,
SupplierClientId = source.[SupplierClientId],
BuyerId = source.[BuyerId]
WHEN NOT MATCHED THEN
INSERT (Id, SupplierId, SupplierClientId, BuyerId)
VALUES (
source.Id,
source.SupplierId,
source.[SupplierClientId],
source.[BuyerId]);
END
我找不到直接在数据集中或在复制活动的映射选项卡中强制此属性的数据类型的方法。我该如何解决这个问题?
【问题讨论】:
-
你能解决这个问题吗?
-
我最终做的是在 SQL 中创建一个缓冲表,并使用接收器数据集中的自动创建表选项从 cosmosdb 复制到该表。这种方式 adf 似乎可以使用可为空/未定义的属性。然后我使用存储过程的另一个复制活动将缓冲区表与目标表合并。最后我刷新缓冲表。在我看来,这是一个沉重的解决方案,但至少效果很好。
标签: azure-cosmosdb azure-data-factory azure-data-factory-2