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

在TSQL 2019中将JSON数组值拆分为单行的实现方法

在TSQL 2019中拆分JSON数组为多行记录的解决方案

假设你的JSON payload结构类似如下(以用户信息和兴趣数组为例):

{"userId": 101, "userName": "Andreas", "interest": ["hiking", "reading", "coding"]}

要将顶层字段与interest数组中的每个值一一对应生成多行记录,核心是用OPENJSON解析数组,并通过CROSS APPLY关联顶层数据。

单条JSON字符串处理

如果是处理单个JSON变量,执行以下SQL:

DECLARE @payload NVARCHAR(MAX) = N'{"userId": 101, "userName": "Andreas", "interest": ["hiking", "reading", "coding"]}';

SELECT
    JSON_VALUE(@payload, '$.userId') AS userId,
    JSON_VALUE(@payload, '$.userName') AS userName,
    interest.value AS interest
FROM
    OPENJSON(@payload, '$.interest') AS interest;

执行后会得到3行结果,每行对应一个兴趣值,顶层字段userId和userName会重复显示。

表中JSON字段批量处理

如果你的JSON数据存储在表的字段中(比如表UserInfo包含JsonData列),用CROSS APPLY关联表数据和数组解析结果:

SELECT
    JSON_VALUE(JsonData, '$.userId') AS userId,
    JSON_VALUE(JsonData, '$.userName') AS userName,
    interest.value AS interest
FROM
    UserInfo
CROSS APPLY
    OPENJSON(JsonData, '$.interest') AS interest;

处理数组内的对象结构

如果interest数组中存储的不是字符串而是对象(比如带属性的兴趣项),可以用OPENJSON的WITH子句解析对象字段:

DECLARE @payload NVARCHAR(MAX) = N'{"userId": 101, "userName": "Andreas", "interest": [{"name":"hiking","level":"high"},{"name":"reading","level":"medium"}]}';

SELECT
    JSON_VALUE(@payload, '$.userId') AS userId,
    JSON_VALUE(@payload, '$.userName') AS userName,
    interest.name,
    interest.level
FROM
    OPENJSON(@payload, '$.interest')
    WITH (
        name NVARCHAR(50) '$.name',
        level NVARCHAR(20) '$.level'
    ) AS interest;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:37:49