使用Azure Data Factory加载SQL Server数据到Snowflake报错如何解决
问题根因
你的推测完全准确,这个报错是Snowflake解析ADF生成的中间暂存文本文件时,字段引用规则和实际内容不匹配导致的行解析错位,不是真的缺失换行符。报错里明确指向第7个字段也就是NewValue列,核心原因就是该列中存在未被正确转义的双引号,导致解析器误判字段边界,本该在单列内的内容被识别成多列,遍历到字符'C'的位置时没找到预期的行尾分隔符\r\n就抛出错误。
原始报错信息参考:
ErrorCode=UserErrorOdbcOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=ERROR [22000] Found character 'C' instead of record delimiter '\r\n'
File '93fcbeba-41f7-4824-b8f6-eda4c2965e00/SnowflakeImportCopyCommand/data_93fcbeba-41f7-4824-b8f6-eda4c2965e00_fa1577fb-8544-44a6-8a60-65bd8b2419c5.txt', line 48, character 39
Row 1 starts at line 2, column "myTable"["$7":7]
排查步骤
- 定位出错原始内容:根据报错给出的文件路径,找到ADF复制活动使用的中间暂存存储里的对应txt文件,直接跳转到第48行第39个字符的位置,就能看到触发错误的具体特殊字符,90%以上概率是未转义的半角双引号。
- 核对ADF复制活动配置:重点检查Snowflake接收器的文件格式设置项,确认是否默认使用双引号作为字段包裹符、是否配置了对应的特殊字符转义规则、是否显式指定了字段分隔符和换行符。
- 回溯源表数据:到SQL Server源表中查询对应批次的
NewValue字段值,确认是否存在半角双引号、字段分隔符(如逗号)、嵌入式换行符这类会干扰文本解析的特殊字符。
可落地方案
按优先级从高到低选择:
- 优先方案(零代码改造成本最低):直接调整ADF Snowflake接收器的文件格式参数
显式指定换行符为\r\n、字段分隔符为实际使用的分隔符(如逗号),将字段引用符设置为NONE,或者将转义字符配置为双引号(对应Snowflake端ESCAPE = '"'规则,即字段内的双引号用两个连续双引号转义),不要使用默认的自动识别格式规则。 - 稳定性最高方案:将ADF复制活动的中间暂存文件格式从默认CSV改为Parquet。Parquet是二进制结构化格式,不存在文本转义问题,从根源上规避引号、换行符、特殊字符导致的解析错位,尤其适合OldValue、NewValue这类存储变更日志、长文本内容的字段。
- 临时兜底方案:如果暂时无法调整复制活动配置,可以在源端抽取时对特殊字符做预处理,比如在SQL查询语句中用
REPLACE(NewValue, '"', '""')对双引号做预转义,临时解决解析问题。
注意事项
- 存储操作日志、变更记录的文本字段非常容易混入各类特殊字符,用CSV作为中转格式时必须显式指定所有格式参数,依赖自动识别规则大概率会遇到解析错误。
- 报错信息中标记的
column "myTable"["$7":7]就是指第7个字段解析异常,和你最初的判断完全一致。
内容的提问来源于stack exchange,提问作者Bilal Shafqat
相关产品推荐
相关产品推荐

