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
相关产品推荐
相关产品推荐

