如何通过ADF在SQL中的表值类型中传递可选列

问题描述

我在sql中具有以下表值类型,在Azure数据工厂中使用该表值类型在大容量复制活动中通过存储过程从平面文件导入数据。文件1包含所有三列,因此可以正常工作。文件2仅包含Column1Column2,但没有 Column3。我认为由于该列被定义为NULL,所以可以,但是ADF抱怨当表类型期望为3时,它试图在2列中传递。是否有办法在两个文件中重用此类型并使Column3成为可选项?

 CREATE TYPE [dbo].[TestType] AS TABLE(
    Column1 varchar(50) NULL,Column2 varchar(50) NULL,Column3 varchar(50) NULL
)

目标LandSource上的操作失败: ErrorCode = sqlOperationFailed,'类型= Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,消息= A 数据库操作失败,并显示以下错误:“尝试传递一个 具有2列的表值参数,其中对应的 用户定义的表类型需要3列

如果复制活动行为是一致的,那么无论该活动中是否使用了具有表类型的存储过程或本机BCP,都很好。当不使用表类型并使用认的批量插入时,源文件中缺少的列最终在目标表中为NULL,而不会出现错误(假定列为NULLABLE)。

解决方法

这将导致ADF中的映射错误。

  1. 在“复制活动”中,每个列都需要映射。

enter image description here

  1. 如果源文件只有两列,将导致映射错误。

enter image description here

因此,我建议您创建两个不同的Copy活动并创建一个两列表类型。

,

您可以通过可选列,我已经成功进行了测试,但是步骤会有些复杂。就我而言,文件1具有所有三列,文件2仅具有Column1和Column2,而没有Column3。它将使用“获取元数据”活动,“设置变量”活动,“ ForEach”活动,“ IfCondition”活动。

请按照我的步骤操作:

  1. 您需要定义一个变量FileName来foreach。 enter image description here

  2. 在“获取Metadata1”活动中,我指定了文件路径。 enter image description here

  3. 在ForEach1活动中,使用@activity('Get Metadata1').output.childItems列出文件列表。必须为顺序enter image description here

  4. 在ForEach1活动中,使用“设置变量1”来设置 FileName 变量。 enter image description here

  5. 在“获取元数据2”中,使用item().name指定文件。 enter image description here

  6. 在“获取元数据2”中,使用列数从文件中获取列数。 enter image description here

  7. 在If Contdition1中,使用@greater(activity('Get Metadata2').output.columnCount,2)确定文件是否大于两列。 enter image description here

  8. True 活动中,使用变量 FileName 指定文件。 enter image description here

  9. False 活动中,使用其他列添加列。 enter image description here

  10. 运行调试时,结果显示:
    enter image description here