SQL 将 JSON 列表解析为另一个 table 中的单独行

SQL Parse a JSON list into separate rows in another table

我将遥测数据连续发送到我的 Azure SQL 数据库,最终以以下格式登陆 table:

INSERT INTO landing (ID, rawData)
VALUES
('Device1', [{"value1":"str1","value2":-109.0,"value3":3,"uselessvalue":16.0},{"value1":"str2","value2":-111.0,"value3":3,"uselessvalue":21.0},{"value1":"str3","value2":-113.0,"value3":2,"uselessvalue":18.0}]);

列表中的 JSON 数量可以从 1 个到几十个不等。

我正在尝试将这些值分隔在另一个 table 中的确定行中,以便可以通过这种方式发送它们(可能在触发器内):

INSERT INTO parsedData (ID, value1, value2, value3)
VALUES
('Device1', 'str1', -109.0, 3),
('Device1', 'str2', -111.0, 3),
('Device1', 'str3', -113.0, 2);

我找到了几种方法(用逗号分隔、使用 WHILE 循环、使用 Azure 不支持的关键字,例如 UNNEST),但到目前为止我找不到方法。

在 SQL 服务器中,您可以使用 openjson():

取消嵌套 JSON 数组
insert into parseddata (id, value1, value2, value3)
select l.id, x.*
from landing l
cross apply openjson(l.rawdata) with (
    value1 varchar(50)   '$.value1',
    value2 decimal(5, 2) '$.value2',
    value3 int           '$.value3'
) x

我不得不对 json 对象中的数据类型做出一些假设,您可能需要查看这些假设。