如何从 ADF 传递 TABLE VALUE TYPE in SQL 中的可选列

How to pass optional column in TABLE VALUE TYPE in SQL from ADF

我在 SQL 中有以下 table 值类型,它在 Azure 数据工厂中用于通过存储过程从批量复制的平面文件中导入数据 activity。文件 1 中包含所有三列,因此可以正常工作。文件 2 只有 Column1Column2,但 没有 Column3。我想既然该列被定义为 NULL 就可以了,但是 ADF 抱怨它试图在 table 类型需要 3 时传递 2 列。有没有办法为两个文件重用此类型并使 Column3 可选?

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

Operation on target LandSource failed: ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A database operation failed with the following error: 'Trying to pass a table-valued parameter with 2 column(s) where the corresponding user-defined table type requires 3 column(s)

如果复制 activity 行为是一致的,则无论是否使用 table 类型的存储过程或 activity 中的本机 BCP 都很好。当不使用 table 类型并使用默认批量插入时,源文件中缺失的列最终在目标 table 中为 NULL 而没有错误(假设该列为 NULLABLE)。

会导致ADF映射错误

  1. 在复制 Activity 中,每一列都需要映射。

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

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

你可以pass optional column,我测试成功了,但是步骤会有点复杂。在我的例子中,文件 1 包含所有三列,文件 2 只有列 1 和列 2,但没有列 3。它将使用获取元数据 activity、设置变量 activity、ForEach activity、IfCondition activity.

请按照我的步骤操作:

  1. 你需要为foreach定义一个变量FileName。

  2. 在Get Metadata1 activity中,我指定了文件路径。

  3. 在 ForEach1 activity 中,使用 @activity('Get Metadata1').output.childItems foreach 文件列表。它需要 顺序

  4. 在 ForEach1 activity 中,使用 Set Variable1 设置 FileName 变量。

  5. 在Get Metadata2中,使用item().name指定文件。

  6. 在获取元数据2 中,使用列计数 从文件中获取列计数。

  7. If Contdition1中,使用@greater(activity('Get Metadata2').output.columnCount,2)判断文件是否大于两列。

  8. Trueactivity中,使用变量FileName来指定文件。

  9. Falseactivity中,使用Additional columns添加一个Column。

  10. 我在运行调试的时候,结果显示: