在SQL Server 2017中返回具有属性作为列的所有JSON值和属性

时间:2019-04-29 21:27:13

标签: json tsql sql-server-2016 sql-server-2017

使用一个仅包含两列的表的简单示例(一个ID和一个长JSON字符串),如何轻松地将所有JSON值和属性以及这些属性作为列返回?

我知道我可以随时使用JSON_VALUE并指定特定的键/属性,但是我不想为每个可能的键提供一长串的JSON_VALUE列表。有没有动态的方式来做到这一点?

例如,我有100个JSON键,结果应该是一个id列,另外100个键列及其值?

谢谢。

1 个答案:

答案 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子句。