使用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
相关产品推荐
相关产品推荐

