Пытаюсь понять синтаксис запроса OPENJSON и застрял

#sql #json #open-json

Вопрос:

Я очень старался извлечь данные из сообщения JSON, которое пытаюсь загрузить в некоторые таблицы. Я могу заставить работать это сообщение с одной парой имя/значение над ним, но в другом сообщении есть вторая внешняя пара имя/значение.

 DECLARE @json nvarchar(max) =
'{
"request":
    {
    "requestId" : "3a282d32-4ed4-48e8-a6c0-23cf4921737e",
    "modelType" : "NEW"
    }
}'

select 'request' as title, request.requestId , request.modelType
from openjson(@json)
with
(
   request nvarchar(max) as json 
)
as Projects
cross apply openjson (Projects.request)
with
(
    requestId nvarchar(50),
    modelType nvarchar(50)
)  as request
 

Это возвращает строку, как и ожидалось, но как мне написать запрос, если выше указана дополнительная пара имя/значение? Подобный этому:

 DECLARE @json nvarchar(max) =
'{
  "request": {
            "request":
                    {
                    "requestId" : "3a282d32-4ed4-48e8-a6c0-23cf4921737e",
                    "modelType" : "NEW"
                    }
            }   
}'
 

Может ли кто-нибудь помочь. Я знаю, что это, вероятно, действительно просто, но я, кажется, не могу понять, как это сделать. Я единственный человек в своей компании, работающий с JSON, иначе я бы буквально просто спросил их.

Заранее благодарю вас!

Ответ №1:

cross apply Для достижения цели необходим еще один.

 select 'request' as title, request.requestId , request.modelType
from openjson(@json)
with
(
   request nvarchar(max) as json 
)
as Projects
cross apply openjson (Projects.request)
with
(
    request nvarchar(max) as json 
)  as subrequest
cross apply openjson (subrequest.request)
with
(
    requestId nvarchar(50),
    modelType nvarchar(50)
)  as request
 

демонстрация в бд<>скрипка<>

Комментарии:

1. Вот оно что! Теперь я не знаю, что я делал, но мой выглядел очень похожим на ваш, когда я возился, но это было именно так! Почему это было так трудно для меня, я никогда не пойму. Я думаю, что, возможно, я пытался использовать ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ в неправильном месте для второй пары значений