【发布时间】:2021-09-23 03:16:13
【问题描述】:
我正在使用复制数据活动将数据从 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将“使用类型默认值”设置为false
但是,当值在源 (Azure DB) 中为空字符串时,进行此更改会导致在 Synapse 中的 FeeReason 值为 NULL。无论如何我可以将“使用类型默认值”设置为 False 仅用于十进制列?
对此我有一个非常肮脏的解决方案,它涉及在源数据库中创建一个名为 FeeReasonIsEmpty 的 BIT 列,并标记其中 FeeReason 实际上是一个空字符串的记录,一旦数据被复制过来,我就可以更新 NULL 值在相关的地方清空字符串。如果可能的话,我想避免这种情况,因为实际上我有多个表,其中包含多个十进制列和多个 varchar/nvarchar 列,其中包含需要保留的空字符串。这个肮脏的解决方案意味着我需要为每一个创建一个“IsEmpty”列,我真的不想这样做。 谢谢。
【问题讨论】:
标签: azure-sql-database azure-data-factory azure-data-factory-2 azure-synapse polybase