Как обновить свойство вставки JSON в массиве объектов с помощью T-SQL - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь найти эффективный способ вставить свойство в существующий массив json без необходимости делать это по индексу. Например, скажем, у нас было:

DECLARE @json NVARCHAR(MAX);
SET @json = N'
  {
    "objs":[
       {"id":1},
       {"id":2}
     ]
  }
'

Как добавить свойство для каждого объекта в массиве? Я хотел бы сделать что-то вроде этого:

JSON_MODIFY(@json,'$.objs[].parent_id',1);

Но это не работает, потому что я не предоставил индекс массива. Я уверен, что есть простое решение, но я не смог найти его в документации.

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

Если вы используете SQL Server 2017+, вы можете использовать JSON_MODIFY() с выражением в качестве пути, как описано в документации:

В SQL Server 2017 (14.x) и вВ базе данных SQL Azure можно указать переменную в качестве значения пути.

JSON:

DECLARE @json NVARCHAR(MAX);
SET @json = N'{
   "objs":[
      {
         "id":1
      },
      {
         "id":2
      }
   ]
}';

Оператор:

SELECT @json = JSON_MODIFY(@json, CONCAT('$.objs[', [key], '].parent_id'), 1)
FROM OPENJSON(@json, '$.objs')

Результат:

{
   "objs":[
      {
         "id":1,
         "parent_id":1
      },
      {
         "id":2,
         "parent_id":1
      }
   ]
}
1 голос
/ 11 декабря 2019

Полагаю, вы можете использовать OPENJSON и FOR JSON для измельчения и объединения JSON:

DECLARE @json NVARCHAR(MAX);

SET @json = N'{
  "objs": [{
    "id": 1
  }, {
    "id": 2
  }]
}';

SELECT id, 1 AS parent_id
FROM OPENJSON(@json, '$.objs')
WITH (
    id INT '$.id'
)
FOR JSON PATH, ROOT('objs')

Результат:

{
  "objs": [{
    "id": 1,
    "parent_id": 1
  }, {
    "id": 2,
    "parent_id": 1
  }]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...