使用一个仅包含两列的表的简单示例(一个ID和一个长JSON字符串),如何轻松地将所有JSON值和属性以及这些属性作为列返回?
我知道我可以随时使用JSON_VALUE
并指定特定的键/属性,但是我不想为每个可能的键提供一长串的JSON_VALUE
列表。有没有动态的方式来做到这一点?
例如,我有100个JSON键,结果应该是一个id列,另外100个键列及其值?
谢谢。
答案 0 :(得分:0)
如果您的JSON对象只是键值对的一级列表,则可以调用OPENJSON
:
DECLARE @mockup TABLE(Id INT, SomeJSON NVARCHAR(MAX));
INSERT INTO @mockup VALUES
(1,N'{"key1":"value1","key2":"value2"}')
,(2,N'{"key1":"value1","key5":"value5"}')
,(3,N'{"keyA":"valueA","keyB":"valueB","keyZ":"valueZ"}');
SELECT t.Id
,A.*
FROM @mockup t
CROSS APPLY OPENJSON(t.SomeJSON) A;
结果
1 key1 value1 1
1 key2 value2 1
2 key1 value1 1
2 key5 value5 1
3 keyA valueA 1
3 keyB valueB 1
3 keyZ valueZ 1
要以表格格式并排获取此信息,可以使用PIVOT
,条件聚合或-可能最好使用WITH
子句:
SELECT t.Id
,A.*
FROM @mockup t
CROSS APPLY OPENJSON(t.SomeJSON)
WITH(key1 NVARCHAR(10)
,key2 NVARCHAR(10)
,key5 NVARCHAR(10)
,keyA NVARCHAR(10)
,keyB NVARCHAR(10)
,keyZ NVARCHAR(10)
) A;
结果
Id key1 key2 key5 keyA keyB keyZ
1 value1 value2 NULL NULL NULL NULL
2 value1 NULL value5 NULL NULL NULL
3 NULL NULL NULL valueA valueB valueZ
无论如何,您必须事先知道所有可能的键。这种方法可以实现最佳命名,您可以指定适当的类型。
如果您事先不知道所有键,则可以考虑使用动态SQL 。您可以使用上面的语句读取所有键并动态创建拟合语句/ WITH子句。