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

Retaining empty strings when using POLYBASE to copy data from Azure SQL db to Azure Synapse

我正在使用复制数据 activity 将数据从 Azure SQL 数据库复制到 Azure Synapse。我正在尝试使用 Polybase 作为复制方法。这在大多数 table 上都能成功运行,但我的源和目标 table 包含以下列:

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

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

当我尝试将 table 从 Azure SQL 数据库复制到 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

将“使用默认类型”设置为 false

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

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

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

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

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

我鼓励您将此案例添加为下面的反馈项 link。产品团队将密切关注那里的反馈,并在未来的版本中考虑它们:FeedBack