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

SQL中对另一表每条记录的JSON响应递归解析并合并为单表

嘿,我完全懂你现在的需求——要批量处理表中每条JSON字符串,用parseJSON解析后把所有结果合并成一张统一的表对吧?其实不用把事情想复杂,SQL Server里的CROSS APPLY就是干这个的绝佳工具,几步就能搞定!

核心解决方案:用CROSS APPLY批量关联表值函数

假设你存储JSON的表叫JsonDataTable,里面有个列JsonContent专门存要解析的JSON字符串,那只需要一行简单的查询就能实现批量解析+结果合并:

SELECT 
    -- 保留原表的记录ID,方便后续关联回原始数据
    jdt.RecordId AS SourceRecordId,
    pj.element_id,
    pj.sequenceNo,
    pj.parent_ID,
    pj.Object_ID,
    pj.NAME,
    pj.StringValue,
    pj.ValueType
FROM JsonDataTable jdt
-- 对原表每一行调用parseJSON,自动合并所有结果集
CROSS APPLY parseJSON(jdt.JsonContent) pj

关键细节说明

  • CROSS APPLY的作用:它会遍历JsonDataTable里的每一行,对每行的JsonContent执行parseJSON函数,然后把所有函数返回的表值结果无缝合并成一张大表——完全不用自己写递归逻辑,函数本身如果已经支持递归解析嵌套JSON(从你给的示例看,它能识别object类型,应该已经做了递归处理),那直接就能拿到所有层级的解析结果。
  • 兼容无效JSON的小技巧:如果你的表中存在空JSON或者格式无效的字符串,不想因为这些行丢失原始记录,可以把CROSS APPLY换成OUTER APPLY,这样即使parseJSON返回空结果,原表的行也会保留(对应的解析列会显示NULL)。

额外优化建议(可选)

如果你的SQL Server版本是2016及以后,其实可以考虑用原生的OPENJSON函数替代自定义的parseJSON,它的性能更好,语法也更直观:

SELECT 
    jdt.RecordId AS SourceRecordId,
    [key] AS NAME,
    value,
    type AS ValueType
FROM JsonDataTable jdt
CROSS APPLY OPENJSON(jdt.JsonContent)

原生函数还支持更灵活的嵌套JSON解析、指定返回结构等功能,要是能切换的话会更省心~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:56:37