使用 POLYBASE 将数据从 Azure SQL db 复制到 Azure Synapse 时保留空字符串

问题描述

我正在使用复制数据活动将数据从 Azure sql 数据库复制到 Azure Synapse。我正在尝试使用 polybase 作为复制方法。这在大多数表上都能成功运行,但我有一个包含以下列的源表和目标表:

Fee DECIMAL(18,2) NULL,FeeReason VARCHAR(500) NOT NULL

由于我无法控制的原因,我无法更改列以允许 FeeReason 列中的 NULL。表中,如果Fee为NULL,则FeeReason为空串。

当我尝试将表从 Azure sql DB 复制到 Synapse 时,当该值为 NULL 时,我收到有关费用列的错误

ErrorCode=FailedDbOperation,......HadoopsqlException: Error converting data type VARCHAR to DECIMAL.....Detailed Message=Empty string can't be converted to DECIMAL.....

这个问题的解决方案是按照loading-to-decimal-column

将“Use Type Default”设置设置为false

但是,当源 (Azure DB) 中的值是空字符串时,进行此更改会导致 Synapse 中的 FeeReason 值为 NULL。无论如何,我可以将“使用类型认值”设置为 False 仅用于十进制列吗?

我有一个非常脏的解决方案,它涉及在源数据库中创建一个名为 FeeReasonIsEmpty 的 BIT 列并标记记录,其中 FeeReason 实际上是一个空字符串,一旦数据被复制,我就可以更新 NULL 值相关的空字符串。如果可能的话,我想避免这种情况,因为实际上我有多个带有多个十进制列的表和多个带有需要保留的空字符串的 varchar/nvarchar 列。这个肮脏的解决方案意味着我需要为每个人创建一个“IsEmpty”列,我真的不想这样做。 谢谢。

解决方法

遗憾的是,我们目前无法将 UseTypeDefault 设置控制为仅特定列。

为了避免您的问题,此时您必须选择源数据集中的位列选项。到目前为止,我试图找到解决方案,直到现在,这似乎是为各个列创建 IsEmpty 列的唯一选项。

注意:目前,ADF 中的 PolyBase 仅接受与目标表中相同数量的列:Columns with default values

我鼓励您将此案例添加为以下链接中的反馈项目。产品团队将密切监控那里的反馈,并在未来版本中考虑它们:FeedBack