-2

所以我编写了一个查询,将输出作为 JSON 对象数组提供,其中一个对象如下

{

        "cardType": "abc",
        "createdOnDateTime": "2020-03-26",
        “课程名称”:“课程1”,
        “课程ID”:1,
        “节名”:1,
        “学生名单”:[
            {
                “姓名”:“学生 1”,
                “名称链接”:“0”
            },
            {
                “姓名”:“学生 2”,
                “名称链接”:“0”
            },
            {
                “姓名”:“学生 3”,
                “名称链接”:“0”
            }
        ]
    }

但我希望输出为

    {
        "cardType": "abc",
        "createdOnDateTime": "2020-03-26",
        “有效载荷”:{
            “课程名称”:“课程1”,
            “课程ID”:1,
            “节名”:1,
            “学生名单”:[
                {
                    “姓名”:“学生 1”,
                    “名称链接”:“0”
                },
                {
                    “姓名”:“学生 2”,
                    “名称链接”:“0”
                },
                {
                    “姓名”:“学生 3”,
                    “名称链接”:“0”
                }
            ]
        }
    }

我在 Select 查询末尾使用了“For JSON Auto”短语,并且由于课程和学生具有一对多关系,因此学生被格式化为数组。我想要的是少数节点以及“studentList”节点数组应该嵌套在自定义节点“有效负载”下。如何使用 For JSON 及其相关属性在 SQL 查询中实现这一点?

4

2 回答 2

1

根据您到目前为止给我们的信息,完全猜测您的数据和查询是什么样的。对 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"
            }
        ]
    }
}
于 2020-03-26T12:08:15.653 回答
0

我的查询最终得到了解决,我在 youtube 上发现了这个非常有用的视频,它准确地显示了我必须做的事情。点击这里观看视频。还有一件事,这个视频是一个很好的例子,但是对于大数据,这种方法使得查询很慢。

于 2020-03-31T13:22:05.023 回答