【问题标题】:How to pass optional column in TABLE VALUE TYPE in SQL from ADF如何从 ADF 传递 SQL 中 TABLE VALUE TYPE 中的可选列
【发布时间】:2020-09-25 20:03:15
【问题描述】:

我在 SQL 中有以下表值类型,它在 Azure 数据工厂中用于通过存储过程从大容量复制活动中的平面文件导入数据。文件 1 包含所有三列,因此可以正常工作。文件 2 只有 Column1Column2,但 NOT 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,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A 数据库操作失败并出现以下错误:'尝试通过 具有 2 列的表值参数,其中对应的 用户定义的表类型需要 3 列

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

【问题讨论】:

标签: sql-server azure-data-factory table-valued-parameters


【解决方案1】:

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

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

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

所以,我建议你创建两个不同的 Copy 活动并创建一个两列表格类型。

【讨论】:

  • 感谢您的建议。但是,如果您不映射列名,它会更灵活一些。如果文件中不存在列但表中存在列,则如果它可以为空,它将仅填充一个 NULL 值。听起来这现在是不可能的。
【解决方案2】:

你可以通过可选列,我已经测试成功了,但是步骤会有点复杂。就我而言,文件 1 包含所有三列,文件 2 只有 Column1 和 Column2,但没有 Column3。它将使用 Get Metadata 活动、Set Variable 活动、ForEach 活动、IfCondition 活动。

请按照我的步骤操作:

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

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

  3. 在 ForEach1 活动中,使用@activity('Get Metadata1').output.childItems foreach 文件列表。它必须是顺序的

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

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

  6. 在 Get Metadata2 中,使用 Column count 从文件中获取列数。

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

  8. True 活动中,使用变量 FileName 来指定文件。

  9. False 活动中,使用 Additional columns 添加一个 Column。

  10. 当我运行调试时,结果显示:

【讨论】:

  • 好答案。我有完全相同的问题。我正在尝试按照您的步骤进行操作。但是,我无法重现第 2 步。我的查找中没有子项。那个是从哪里来的?或者流程变了。我很高兴提出新问题。我们可以在聊天中解决,然后我可以发帖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多