如何从 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 只有 Column1
和 Column2
,但 没有 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映射错误
- 在复制 Activity 中,每一列都需要映射。
- 如果源文件只有两列,会导致映射错误。
因此,我建议您创建两个不同的复制活动并创建一个两列 table 类型。
你可以pass optional column,我测试成功了,但是步骤会有点复杂。在我的例子中,文件 1 包含所有三列,文件 2 只有列 1 和列 2,但没有列 3。它将使用获取元数据 activity、设置变量 activity、ForEach activity、IfCondition activity.
请按照我的步骤操作:
你需要为foreach定义一个变量FileName。
在Get Metadata1 activity中,我指定了文件路径。
在 ForEach1 activity 中,使用 @activity('Get Metadata1').output.childItems
foreach 文件列表。它需要 顺序 。
在 ForEach1 activity 中,使用 Set Variable1 设置 FileName 变量。
在Get Metadata2中,使用item().name
指定文件。
在获取元数据2 中,使用列计数 从文件中获取列计数。
If Contdition1中,使用@greater(activity('Get Metadata2').output.columnCount,2)
判断文件是否大于两列。
在Trueactivity中,使用变量FileName来指定文件。
在Falseactivity中,使用Additional columns添加一个Column。
我在运行调试的时候,结果显示:
我在 SQL 中有以下 table 值类型,它在 Azure 数据工厂中用于通过存储过程从批量复制的平面文件中导入数据 activity。文件 1 中包含所有三列,因此可以正常工作。文件 2 只有 Column1
和 Column2
,但 没有 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映射错误
- 在复制 Activity 中,每一列都需要映射。
- 如果源文件只有两列,会导致映射错误。
因此,我建议您创建两个不同的复制活动并创建一个两列 table 类型。
你可以pass optional column,我测试成功了,但是步骤会有点复杂。在我的例子中,文件 1 包含所有三列,文件 2 只有列 1 和列 2,但没有列 3。它将使用获取元数据 activity、设置变量 activity、ForEach activity、IfCondition activity.
请按照我的步骤操作:
你需要为foreach定义一个变量FileName。
在Get Metadata1 activity中,我指定了文件路径。
在 ForEach1 activity 中,使用
@activity('Get Metadata1').output.childItems
foreach 文件列表。它需要 顺序 。在 ForEach1 activity 中,使用 Set Variable1 设置 FileName 变量。
在Get Metadata2中,使用
item().name
指定文件。在获取元数据2 中,使用列计数 从文件中获取列计数。
If Contdition1中,使用
@greater(activity('Get Metadata2').output.columnCount,2)
判断文件是否大于两列。在Trueactivity中,使用变量FileName来指定文件。
在Falseactivity中,使用Additional columns添加一个Column。
我在运行调试的时候,结果显示: