Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
всем привет!

Есть ли возможность средствами FOR JSON сформировать JSON в виде dictionary, где значение поля используется для формирования имени свойтва JS-объекта?

Т.е. из такой таблицы:
ParentIdPropNamePropValue
1Aaa111
1Bbb222
1Ccc333
1Ddd444
2Xxx444
2Yyy555


получить такой JSON:
[
  {
    "ParentId":1,
    "Aaa":111,
    "Bbb":222,
    "Ccc":333,
    "Ddd":444
  },
  {
    "ParentId":2,
    "Xxx":333,
    "Yyy":444
  }
]


Я понимаю, что можно отдельные тексты для свойств сформировать "руками" и потом соединить через STRING_AGG, но возможно ли такое средствами FOR JSON?
3 июн 19, 17:36    [21900746]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Konst_One
Member

Откуда:
Сообщений: 11518
здесь смотрели?
https://docs.microsoft.com/ru-ru/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-2017
3 июн 19, 17:38    [21900747]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Konst_One,

да, конечно. Но дело в том, что стандартными средствами (а в статье о них речь) мы получим такой JSON:
[
  {
    "ParentId":1,
    "PropName":"Aaa",
    "PropValue":111
  },
  {
    "ParentId":1,
    "PropName":"Bbb",
    "PropValue":222
  },
  {
    "ParentId":1,
    "PropName":"Ccc",
    "PropValue":333
  }
  // и т.д.
]


а надо так:

[
  {
    "ParentId":1,
    "Aaa":111,
    "Bbb":222,
    "Ccc":333,
    "Ddd":444
  },
  {
    "ParentId":2,
    "Xxx":333,
    "Yyy":444
  }
]
3 июн 19, 17:48    [21900756]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Konst_One
Member

Откуда:
Сообщений: 11518
так вам сначала надо подготовить вашу таблицу правильно, а то у вас EAV по сути
3 июн 19, 17:52    [21900763]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Konst_One
Member

Откуда:
Сообщений: 11518
select * from table1 where ParentId =1 for json path


правильно сделает?
3 июн 19, 17:56    [21900767]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Konst_One,

нет, т.к. получится JSON, в котором массив однотипных объектов у которых столбцы переведены в свойства.
А мне надо массив не похожих dictionary-объектов
3 июн 19, 18:10    [21900788]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
вот такое будет:

[
  {
    "ParentId":1,
    "PropName":"Aaa",
    "PropValue":111
  }
]
3 июн 19, 18:11    [21900790]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
newLoginSql
Member

Откуда:
Сообщений: 10
Вам нужен PIVOT:

DECLARE @EAV TABLE (ParentID int, PropName varchar(3), PropValue int)

INSERT INTO @EAV([ParentID], [PropName], [PropValue])
VALUES(1, 'Aaa', 111), (1, 'Bbb', 222), (1, 'Ccc', 333)


SELECT * FROM @EAV
PIVOT
(
  MAX(PropValue)  
FOR PropName IN ([Aaa], [Bbb], [Ccc])
)AS T
for json PATH
3 июн 19, 18:15    [21900793]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
newLoginSql,

Спасибо за запрос!
К сожалению не подойдет, т.к. подразумевает, что значения [PropName] заранее известны и их фиксированное количество.
4 июн 19, 09:45    [21901195]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
1C Developer
Member

Откуда:
Сообщений: 65
Yuri Abele
newLoginSql,

Спасибо за запрос!
К сожалению не подойдет, т.к. подразумевает, что значения [PropName] заранее известны и их фиксированное количество.


Почитайте про динамический sql.

Затем заверните скрипт newLoginSql в динамику.
4 июн 19, 09:53    [21901203]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
1C Developer,

спасибо за совет :-)
Но, предроложу, что Вы не до конца вникли в постановку задачи.
Прочитайте, будьте добры, первый постинг
4 июн 19, 10:49    [21901282]     Ответить | Цитировать Сообщить модератору
 Re: FOR JSON запрос - вывод dictionary  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
В общем, стандартными средствами никак.
Пришлось собирать JSON-текст с помощью STRING_AGG самому из кусочков.
5 июн 19, 09:39    [21902152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить