如果您的 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 子句。