创建ADF管道时,从Cosmos DB复杂JSON提取字段并转换至SQL的问题
解决Cosmos DB JSON嵌套字段转换与SQL类型适配问题
一、先解决嵌套子列的访问问题
你提到用cast时找不到目标子列,大概率是工具对嵌套JSON字段的路径解析规则问题:
- 尝试用方括号替代点语法访问嵌套字段,比如
content['current']['fsid']而非content.current.fsid - 如果是ETL工具(如Azure Data Factory),先刷新数据源的Schema,确保工具能识别到
content下的嵌套子字段
二、fsid字符串按条件映射为整数
toInteger(content.current.fsid)返回null是因为fsid是"PP"/"QQ"这类非数字字符串,无法直接转整数,必须用条件判断实现映射:
若用ETL工具的派生列(以ADF为例)
iif(content.current.fsid == 'PP', 1, iif(content.current.fsid == 'QQ', 2, null))
若用Cosmos DB SQL查询直接转换
CASE WHEN content.current.fsid = 'PP' THEN 1 WHEN content.current.fsid = 'QQ' THEN 2 ELSE NULL END AS fsid_int
注意:如果content.current可能为null,要先加非空判断,避免报错:iif(not(isNull(content.current)), [上述逻辑], null)
三、fpid字符串转整数
fpid是数字格式的字符串(如"2021"),可以直接转换,但建议加合法性校验:
ETL工具派生列写法
iif(not(isNull(content.current.fpid)) and isInteger(content.current.fpid), toInteger(content.current.fpid), null)
Cosmos DB SQL写法
CAST(content.current.fpid AS INT) AS fpid_int
四、date字段转SQL datetime格式
原date是ISO 8601格式字符串,需根据目标SQL数据库的类型选择转换方式:
- SQL Server:若目标字段是
datetime2(支持0001年这类早于1753年的日期),直接转换:
若用CAST([date] AS DATETIME2) AS sql_datedatetime类型,需注意原date的范围是否符合(SQL Server datetime仅支持1753-01-01之后) - ETL工具(如ADF):先转成标准时间类型再输出到SQL:
toDateTime(date)
内容的提问来源于stack exchange,提问作者Vishal Verma
相关产品推荐
相关产品推荐

