You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Polybase从Azure SQL拷贝数据到Azure Synapse时保留空字符串并解决DECIMAL转换问题

结论

Azure 数据工厂的Copy Activity中,Use Type Default为Sink端的全局配置,暂不支持针对指定列/指定数据类型单独设置,你可以通过以下两种更易批量落地的方案实现需求,不需要修改源表结构新增标记列:


方案1:源查询预处理+后置批量修正(适配性最高,无需调整加载方式)

该方案不需要修改你当前的Polybase加载逻辑,仅调整Copy Activity的源读取规则和新增后置执行步骤即可:

  • 源配置放弃直接选表,改用自定义查询读取数据,对需要保留空字符串的VARCHAR/NVARCHAR列,将空字符串替换为不会出现在业务数据中的特殊占位符,避免被全局Use Type Default=False配置转为NULL
  • 同步完成后通过单次后置SQL脚本,批量将所有字符串列的占位符替换回空字符串

示例源查询代码

SELECT
    CAST(Fee AS DECIMAL(18,2)) AS Fee,
    -- 空字符串转自定义占位符
    CASE WHEN FeeReason = '' THEN '^_EMPTY_STR_^' ELSE FeeReason END AS FeeReason
    -- 其余列直接查询即可
FROM [源表名]

示例后置修正SQL

UPDATE [目标表名]
SET
    FeeReason = CASE WHEN FeeReason = '^_EMPTY_STR_^' THEN '' ELSE FeeReason END
    -- 多表多列可批量生成SET项,无需单独新增标记列
WHERE FeeReason = '^_EMPTY_STR_^'

方案2:改用COPY INTO加载方式(性能最优,无需后置修正)

在Copy Activity的Sink配置中,将拷贝方式从Polybase改为COPY statement,该加载方式支持更灵活的列级/类型级转换规则,无需设置全局Use Type Default即可解决DECIMAL转换问题,同时保留字符串空字符串:

示例自定义COPY语句

COPY INTO [目标表名] (
    Fee DECIMAL(18,2) NULL,
    FeeReason VARCHAR(500) NOT NULL
    -- 其余列按目标表结构定义
)
FROM '@pipeline().parameters.sourceFileStoragePath'
WITH (
    FILE_TYPE = 'PARQUET', -- 替换为你实际使用的中间文件类型
    CREDENTIAL = (IDENTITY = 'Managed Identity'), -- 替换为你实际的访问凭证配置
    EMPTY_STRING_AS_NULL = 'OFF', -- 全局关闭空字符串转NULL,保留VARCHAR列的空值
    NULL_IF = ('Fee', '') -- 仅针对DECIMAL类型的Fee列,单独配置空字符串转NULL
)

内容的提问来源于stack exchange,提问作者Woody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 05:54:00