Если ваш 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.