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

在SQL Server中将JSON转换为扁平化表格的技术求助

SQL Server JSON 扁平化处理方案

因为看不到你具体的JSON结构和目标表样例,先给你一套通用的OPENJSON实现思路,你可以对照自己的数据调整:

基础场景(单层数组嵌套)

假设你的源表叫JsonStorage,有个存储JSON的列RawJson,JSON结构大概是这样:

{
  "OrderId": "ORD001",
  "CustomerName": "张三",
  "Products": [
    {"ProductId": 1, "ProductName": "手机", "Price": 3999},
    {"ProductId": 2, "ProductName": "耳机", "Price": 299}
  ]
}

要扁平化的目标表是把订单信息和每个商品信息拆成一行一行,那可以用下面的SQL:

SELECT
  -- 提取JSON顶层字段
  JSON_VALUE(js.RawJson, '$.OrderId') AS OrderId,
  JSON_VALUE(js.RawJson, '$.CustomerName') AS CustomerName,
  -- 提取数组里的字段
  oj.ProductId,
  oj.ProductName,
  oj.Price
FROM JsonStorage js
-- 交叉应用OPENJSON解析数组部分
CROSS APPLY OPENJSON(js.RawJson, '$.Products')
WITH (
  ProductId INT '$.ProductId',
  ProductName NVARCHAR(100) '$.ProductName',
  Price DECIMAL(10,2) '$.Price'
) oj

多层嵌套场景

如果JSON里还有更深层次的嵌套数组(比如每个商品下有多个规格),可以嵌套使用CROSS APPLY OPENJSON:

SELECT
  JSON_VALUE(js.RawJson, '$.OrderId') AS OrderId,
  oj.ProductId,
  oj.ProductName,
  oj2.SpecName,
  oj2.SpecValue
FROM JsonStorage js
CROSS APPLY OPENJSON(js.RawJson, '$.Products')
WITH (
  ProductId INT '$.ProductId',
  ProductName NVARCHAR(100) '$.ProductName',
  -- 把嵌套的Specs数组作为JSON字符串传递给下一层OPENJSON
  Specs NVARCHAR(MAX) '$.Specs' AS JSON
) oj
CROSS APPLY OPENJSON(oj.Specs)
WITH (
  SpecName NVARCHAR(50) '$.Name',
  SpecValue NVARCHAR(50) '$.Value'
) oj2

根数组场景

如果你的RawJson列本身就是一个数组(比如整个列内容是[{"Id":1},{"Id":2}]),那直接解析根数组即可:

SELECT
  oj.Id,
  oj.Name
FROM JsonStorage js
CROSS APPLY OPENJSON(js.RawJson)
WITH (
  Id INT '$.Id',
  Name NVARCHAR(50) '$.Name'
) oj

你只需要把上面示例中的JSON路径、字段类型和名称替换成你实际的结构就行。如果还是有问题,把你的JSON示例和目标表字段列出来,我再帮你调整具体的SQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:35:40