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

创建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_date
    
    若用datetime类型,需注意原date的范围是否符合(SQL Server datetime仅支持1753-01-01之后)
  • ETL工具(如ADF):先转成标准时间类型再输出到SQL:
    toDateTime(date)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:42:49