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

SQL Server多独立单记录表JSON导出无数组嵌套问题

解决SQL Server联合查询生成嵌套JSON对象的问题

我太懂这种纠结了——明明单个表能导出干净的无数组JSON,联合起来要么变成数组嵌套,要么被转义成字符串。别着急,咱们针对你的SQL Server版本来给出简洁的解决方案。

问题根源

  • 子查询用FOR JSON PATH时,默认会把结果包裹成数组,哪怕只有一条记录,也就出现了你看到的"Part1": [ {...} ]结构。
  • 给子查询加WITHOUT_ARRAY_WRAPPER后,SQL Server会把这段JSON当成普通字符串处理,所以自动转义了引号,变成"{\"Data1\":\"Data1\"}"这种格式。

解决方案

1. SQL Server 2016(当前版本可用)

用JSON_QUERY()函数标记子查询的结果是合法JSON,避免被转义,同时子查询保留WITHOUT_ARRAY_WRAPPER生成单个对象:

DECLARE @Json nvarchar(max) = ( 
  SELECT 
    JSON_QUERY((SELECT 'Data1' AS [Data1], 'Data2' AS [Data2] FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)) AS [Part1],
    JSON_QUERY((SELECT 'Text1' AS [Text1], 'Text2' AS [Text2] FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)) AS [Part2]
  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 
); 
SELECT @Json; 
GO

2. SQL Server 2017及以上(升级后更简洁)

2017引入了JSON_OBJECT()函数,可以直接构造顶层JSON对象,写法更直观:

DECLARE @Json nvarchar(max) = JSON_OBJECT(
  'Part1': (SELECT 'Data1' AS [Data1], 'Data2' AS [Data2] FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER),
  'Part2': (SELECT 'Text1' AS [Text1], 'Text2' AS [Text2] FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)
);
SELECT @Json;
GO

验证输出

两种方案都会生成你期望的结构:

{ "Part1": { "Data1": "Data1", "Data2": "Data2" }, "Part2": { "Text1": "Text1", "Text2": "Text2" } }

注意事项

如果是从实际业务表查询数据,只要把子查询里的硬编码值换成对应表的查询即可(比如SELECT Data1, Data2 FROM YourTable1 WHERE Id = 1),确保子查询只返回一条记录——因为你的需求是单记录表,这点刚好匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:06:32