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

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;

返回结果

IDCountryCountry NameInflation
1USUnited States of America5.0
2MXMexico6.0
3CACanada5.5

补充说明

  • 该写法性能最优,不需要调整现有表结构,适合大表场景下的JSON解析。
  • 如果表中存在JSON格式非法的记录,可以在WHERE条件中增加ISJSON(t.Object) = 1过滤异常行,避免解析中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:21:47