SQL JSON: вложите несколько узлов под пользовательский узел, используя запрос sql FOR JSON - PullRequest
0 голосов
/ 26 марта 2020

Итак, я написал запрос, который дает вывод в виде массива JSON объектов, один из объектов ниже

{

        "cardType": "abc",
        "createdOnDateTime": "2020-03-26",
        "courseName": "course1",
        "courseID": 1,
        "sectionName": 1,
        "studentList": [
            {
                "name": "student 1",
                "nameLink": "0"
            },
            {
                "name": "student 2",
                "nameLink": "0"
            },
            {
                "name": "student 3",
                "nameLink": "0"
            }
        ]
    }

Но я хочу вывод как

    {
        "cardType": "abc",
        "createdOnDateTime": "2020-03-26",
        "payload" : {
            "courseName": "course1",
            "courseID": 1,
            "sectionName": 1,
            "studentList": [
                {
                    "name": "student 1",
                    "nameLink": "0"
                },
                {
                    "name": "student 2",
                    "nameLink": "0"
                },
                {
                    "name": "student 3",
                    "nameLink": "0"
                }
            ]
        }
    }

Я использовал фразу «Для JSON Авто» в конце моего запроса Select, и, поскольку курс и студент имеют отношение «один ко многим», студент форматируется в массиве. Я хочу, чтобы несколько узлов вместе с массивом узлов studentList были вложены в пользовательский узел полезной нагрузки. Как этого можно достичь в запросе SQL, используя For JSON и связанные с ним свойства?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Полное предположение здесь о том, как выглядят ваши данные и запросы, исходя из того, что мало вы нам дали. Используйте подзапрос для studentList с for json auto, затем при внешнем запросе используйте for json path, without_array_wrapper.

При использовании for json path вы можете вкладывать элементы друг в друга, задавая им пути, разделенные точками, то есть: разделяющий родительский элемент элементы от детей с символами точки (.), такие как следующие ...

create table dbo.Course (
  cardType nvarchar(3),
  createdOnDateTime date,
  courseName nvarchar(20),
  courseID int,
  sectionName int
);
insert dbo.Course values
  ('abc', '2020-03-26', 'course1', 1, 1);
go
create table dbo.Student (
  courseID int,
  name nvarchar(20),
  nameLink nvarchar(20)
);
insert dbo.Student values
  (1, 'student 1', '0'),
  (1, 'student 2', '0'),
  (1, 'student 3', '0');
go
select
  cardType,
  createdOnDateTime,
  [payload.courseName] = courseName,
  [payload.courseID] = courseID,
  [payload.sectionName] = sectionName,
  [payload.studentList] = (
    select name, nameLink
    from dbo.Student S1
    where S1.courseID = C1.courseID
    for json auto
  )
from dbo.Course C1
where courseID = 1
for json path, without_array_wrapper;
go

, что дает результат ...

{
    "cardType": "abc",
    "createdOnDateTime": "2020-03-26",
    "payload": {
        "courseName": "course1",
        "courseID": 1,
        "sectionName": 1,
        "studentList": [
            {
                "name": "student 1",
                "nameLink": "0"
            },
            {
                "name": "student 2",
                "nameLink": "0"
            },
            {
                "name": "student 3",
                "nameLink": "0"
            }
        ]
    }
}
0 голосов
/ 31 марта 2020

Мой запрос был в конечном итоге решен, я нашел это действительно полезное видео на YouTube, которое точно показывает, что я должен был сделать. Нажмите здесь для видео . Еще одна вещь, это видео является очень хорошим примером, но для данных большого размера этот подход делает запрос очень медленным.

...