Во-первых, ваша строка JSON искажена.Вам нужно удалить запятую после закрывающей скобки массива.
Итак, давайте объявим нашу переменную:
DECLARE @json NVARCHAR(MAX) = N'{
"solution": "xxxxxxxxxxxxxxxxxxxxx",
"options": [
{
"choice_id": 205073,
"choice": "aaaa"
},
{
"choice_id": 205074,
"choice": "bbbb"
},
{
"choice_id": 205075,
"choice": "cccc"
},
{
"choice_id": 205076,
"choice": "dddd"
}
]
}'
Теперь вы можете использовать комбинацию OPENJSON()
и FOR JSON
, чтобы получитьпоследняя запись в массиве.
SELECT jsonfield = CAST((
SELECT TOP 1
j.solution
,o.choice_id
,o.choice
FROM
OPENJSON(@json)
WITH
(
solution VARCHAR(MAX) '$.solution'
,options NVARCHAR(MAX) '$.options' AS JSON
) j
CROSS APPLY
OPENJSON(options)
WITH
(
choice_id INT '$.choice_id'
,choice VARCHAR(4) '$.choice'
) o
ORDER BY o.choice_id DESC
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) AS NVARCHAR(MAX))
РЕДАКТИРОВАТЬ:
Или вы можете использовать этот запрос, если вы не хотите упорядочить по любому из значений узла:
SELECT jsonfield = CAST((
SELECT TOP 1
j.solution
--,o.*
,c.choice_id
,c.choice
FROM OPENJSON(@json)
WITH
(
solution VARCHAR(MAX) '$.solution'
,options NVARCHAR(MAX) '$.options' AS JSON
) j
CROSS APPLY OPENJSON(options) o
CROSS APPLY OPENJSON(o.Value)
WITH (
choice_id int '$.choice_id',
choice varchar(4) '$.choice'
) c
ORDER BY [key] DESC
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) AS NVARCHAR(MAX))