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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:35:29