Насколько я знаю, вы не можете создать json с именами ключей переменных с select ... for json
.
Однако, если вы не возражаете против использования переменных и используете Sql Server 2017 (иначе вы не можете использовать динамические клавиши для json-modify
), вы можете сделать это следующим образом:
declare @a nvarchar(max) = '{}'
select
@a = json_modify(
@a,
concat('$.', p.key_code),
json_query((select p.name, p.[date], p.descr for json path, without_array_wrapper))
)
from projects as p
select @a
ДБ демо скрипки
Если вы используете более ранние выпуски Sql Server, вы можете просто агрегировать его с помощью любого метода агрегации, который вы можете найти (я использовал string_agg
просто для простоты здесь):
select
concat('{', string_agg(
concat('"',p.key_code,'":',p.data),
','
), '}')
from (
select
p.key_code,
(select p.name, p.[date], p.descr for json path, without_array_wrapper) as data
from projects as p
) as p
ДБ демо скрипки
Вы также можете использовать string_escape
для предотвращения ошибок, если ваши ключи могут содержать специальные символы:
select
...
concat('"',string_escape(p.key_code,'json'),'":',p.data),
','
...
ДБ демо скрипки