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

SQL Server解析表列中JSON的GetCustomReportResult为表格式报错咨询

问题解决方案

报错原因分析

Msg 13609报错的核心是SQL Server解析的输入内容不符合JSON格式规范,你遇到的位置0出现意外字符'o'常见两个诱因:

  • 部分行的cijreport列存储的不是合法JSON字符串,可能是普通文本(比如存储了object类标识)
  • 没有指定正确的JSON解析路径,直接对根节点执行OPENJSON时,根节点如果是单个对象而非数组,会抛出格式错误

解决方案

第一步:先排查并过滤非法JSON行

执行以下语句找出所有不合法的JSON数据,确认是否有脏数据:

SELECT cijreport, ApplicationId
FROM 你的表名 -- 替换为实际表名
WHERE ISJSON(cijreport) = 0 AND cijreport IS NOT NULL

后续查询统一加ISJSON(cijreport) = 1过滤条件,避免脏数据触发报错。

第二步:修正JSON解析逻辑

根据你需要提取GetCustomReportResult节点内容的需求,分两种场景调整SQL:

场景1:GetCustomReportResult下是对象数组

如果你的JSON结构如下:

{
  "GetCustomReportResult": [
    {"CIP": "值1", "CIQ": "值2", "ApplicationID": "xxx"},
    {"CIP": "值3", "CIQ": "值4", "ApplicationID": "yyy"}
  ]
}

使用带WITH子句的OPENJSON指定解析路径,效率比单独调用JSON_VALUE更高:

SELECT 
  y.cijreport,
  y.ApplicationId AS 表存储的ApplicationId,
  res.CIP,
  res.CIQ,
  res.ApplicationID AS JSON内的ApplicationID
  -- 其他需要的字段可在WITH块中按相同格式补充
FROM 你的表名 AS y
CROSS APPLY OPENJSON(y.cijreport, '$.GetCustomReportResult')
WITH (
  CIP VARCHAR(200) '$.CIP', -- 字段长度和类型根据实际业务调整
  CIQ VARCHAR(200) '$.CIQ',
  ApplicationID VARCHAR(100) '$.ApplicationID'
) AS res
WHERE y.cijreport IS NOT NULL
AND ISJSON(y.cijreport) = 1

场景2:GetCustomReportResult下是单个对象

如果每个cijreport的GetCustomReportResult只有一条数据,不需要CROSS APPLY,直接指定完整路径取值即可:

SELECT 
  cijreport,
  ApplicationId,
  JSON_VALUE(cijreport, '$.GetCustomReportResult.CIP') AS CIP,
  JSON_VALUE(cijreport, '$.GetCustomReportResult.CIQ') AS CIQ
FROM 你的表名
WHERE cijreport IS NOT NULL
AND ISJSON(cijreport) = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:15:04