JSON解析报错:Position 0存在意外字符,SQL语句排查求助
解决SQL Server解析JSON时的"Unexpected Character Found at Position 0"错误
我来帮你捋捋这个问题~你已经确认JSON文件本身没问题,但执行SQL时一直报解析错误,另外你提到的用OUTER APPLY替代CROSS APPLY避免丢行的建议,真的很实用,先给你点个赞!
问题核心原因
你的SQL代码里有个关键的解析逻辑错误,直接导致了JSON报错:
- 当你用
OPENJSON (c.value, '$.planIds') as p展开planIds数组时,p.value已经是数组里的单个数值(比如5、13这类),此时你再用JSON_Value(p.value, '$.planIds')去取值就完全错了——单个数字根本不是JSON对象,自然找不到$.planIds这个键,直接触发了解析错误。
修正后的SQL代码
-- organization affiliations query 修正版 DECLARE @JSON VARCHAR(MAX) SELECT @JSON=BulkColumn FROM OPENROWSET (BULK 'C:\FileDirectory\filename.json', SINGLE_CLOB) IMPORT SELECT JSON_Value (c.value, '$.organizationId') as organizationId, JSON_Value (c.value, '$.locationId') as locationId, p.value as planIds -- 直接取p.value,它就是planIds数组里的单个数值 FROM OPENJSON (@JSON, '$.organizationAffiliations') as c OUTER APPLY OPENJSON (c.value, '$.planIds') as p -- 用OUTER APPLY避免空数组导致数据行丢失
额外说明
- 关于
OUTER APPLY:正如你提醒的,如果某个organizationAffiliations条目里的planIds是空数组,CROSS APPLY会直接丢弃这一行数据,而OUTER APPLY会保留该行,planIds字段显示为NULL,更贴合多数业务场景的需求。 - 关于文件编码:如果你修正后仍有问题,可以检查下JSON文件的编码(确保是UTF-8无BOM格式,SQL Server对带BOM的UTF-8文件可能会出现解析异常)。
你提供的JSON示例
{"organizationAffiliations": [{"organizationId": 2001, "locationId": 3029960, "planIds": [5, 13, 19, 20, 24, 40]}]}
内容的提问来源于stack exchange,提问作者Arden
相关产品推荐
相关产品推荐

