SQL将JSON列表解析为另一个表中的单独行
我将遥测数据连续发送到我的Azure SQL数据库,该数据库最终以以下格式显示在其登录表中:SQL将JSON列表解析为另一个表中的单独行,sql,arrays,json,sql-server,azure-sql-database,Sql,Arrays,Json,Sql Server,Azure Sql Database,我将遥测数据连续发送到我的Azure SQL数据库,该数据库最终以以下格式显示在其登录表中: INSERT INTO landing (ID, rawData) VALUES ('Device1', [{"value1":"str1","value2":-109.0,"value3":3,"uselessvalue":16.0},{"value1":"str2&quo
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到几十个不等
我试图在另一个表中以确定的行分隔这些值,以便可以通过这种方式发送它们(可能在触发器中):
我已经找到了几种方法(使用逗号拆分、使用WHILE循环、使用Azure中不支持的关键字,如unest),但到目前为止我还找不到方法。在SQL Server中,您可以使用
openjson()取消JSON数组的测试。
:
我不得不对json对象中的数据类型做一些假设,您可能需要查看。效果很好,谢谢!您知道如何将value2类型更改为smallint(即使源值是十进制的)吗?如果我只是将数据类型更改为
smallint
,但收到一条错误消息,指示转换失败,并且在尝试使用CAST
INSERT INTO parsedData (ID, value1, value2, value3)
VALUES
('Device1', 'str1', -109.0, 3),
('Device1', 'str2', -111.0, 3),
('Device1', 'str3', -113.0, 2);
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