OPENJSON解析字段报Subquery returned more than 1 value错误咨询
错误原因
你的查询触发报错的核心问题是:OPENJSON() 入参仅支持单个JSON字符串值,你传入的子查询(SELECT Object FROM #temp)会返回#temp表所有行的Object字段(共3条结果),不符合函数入参要求,因此抛出子查询多行返回错误。
另外你提供的测试数据存在JSON语法问题:ID=3的记录中"CountryName": "Canada 缺失值的闭合双引号,不修正的话解析阶段会报JSON格式非法错误。
正确实现代码
表中多行JSON字段解析不需要嵌套子查询,使用CROSS APPLY逐行关联OPENJSON即可,这是SQL Server解析表内JSON列的标准写法,执行结果完全匹配你的预期:
-- 修正后的测试数据(补全ID=3记录缺失的JSON闭合引号) DROP TABLE IF EXISTS #temp; CREATE TABLE #temp ( ID INT, Object VARCHAR(MAX) ); INSERT INTO #temp ( ID, Object ) VALUES ( 1, '{ "Country": "US", "CountryName": "United States of America", "Inflation": 5.0 }'), ( 2, '{ "Country": "MX", "CountryName": "Mexico", "Inflation": 6.0 }'), ( 3, '{ "Country": "CA", "CountryName": "Canada", "Inflation": 5.5 }'); -- 解析查询 SELECT t.ID, j.Country, j.CountryName AS [Country Name], j.Inflation FROM #temp t CROSS APPLY OPENJSON(t.Object) WITH ( Country CHAR(2) '$.Country', CountryName VARCHAR(MAX) '$.CountryName', Inflation DECIMAL(2,1) '$.Inflation' ) j;
返回结果
| ID | Country | Country Name | Inflation |
|---|---|---|---|
| 1 | US | United States of America | 5.0 |
| 2 | MX | Mexico | 6.0 |
| 3 | CA | Canada | 5.5 |
补充说明
- 该写法性能最优,不需要调整现有表结构,适合大表场景下的JSON解析。
- 如果表中存在JSON格式非法的记录,可以在WHERE条件中增加
ISJSON(t.Object) = 1过滤异常行,避免解析中断。
内容的提问来源于stack exchange,提问作者MonkeyMonkey
相关产品推荐
相关产品推荐

