Вернуть все значения и атрибуты JSON с атрибутами в виде столбцов в SQL Server 2017 - PullRequest
0 голосов
/ 30 апреля 2019

Используя простой пример таблицы с двумя столбцами - идентификатором и длинной строкой JSON - как я могу легко вернуть все значения и атрибуты JSON с атрибутами в виде столбцов?

Я знаю, что могу легко использовать JSON_VALUE и указать конкретный ключ / атрибут, но я не хочу иметь длинный список из многочисленных JSON_VALUE для каждого возможного ключа. Есть ли динамичный способ сделать это?

Скажем, например, у меня есть 100 ключей JSON, и результатом должен быть столбец идентификатора с еще 100 ключевыми столбцами и их значениями?

Спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

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

...