返回带有嵌套Json的SQL Server数据库查询
当我使用端点时,我试图得到这样的答案:返回带有嵌套Json的SQL Server数据库查询,sql,sql-server,json,Sql,Sql Server,Json,当我使用端点时,我试图得到这样的答案: [ { "McqID":"7EED5396-9151-4E3D-BCBF-FDB72CDD22B7", "Questions":[ { "QuestionId":"C8440686-531D-4099-89E9-014CAF9ED054", "Question":"human text", "Difficulty":3,
[
{
"McqID":"7EED5396-9151-4E3D-BCBF-FDB72CDD22B7",
"Questions":[
{
"QuestionId":"C8440686-531D-4099-89E9-014CAF9ED054",
"Question":"human text",
"Difficulty":3,
"Answers":[
{
"AnswerId":"7530DCF4-B2D9-48B0-9978-0E4690EA0C34",
"Answer":"human text2",
"IsTrue":false
},
{
"AnswerId":"5D16F17F-E205-42A5-873A-1A367924C182",
"Answer":"human text3",
"IsTrue":false
},
{
"AnswerId":"64E78326-77C3-4628-B9E3-2E8614D63632",
"Answer":"human text4",
"IsTrue":false
},
{
"AnswerId":"199241A9-0EF6-4F96-894A-9256B129CB1F",
"Answer":"human text5",
"IsTrue":true
},
{
"AnswerId":"EDCCAC18-5209-4457-95F2-C91666F8A916",
"Answer":"human text6",
"IsTrue":false
}
]
}
]
}
]
下面是我的问题(示例):
我想要一个嵌套的JSON来表示我的数据,但它最终的格式如下(较小的示例):
我已经尝试了一切,用于JSON路径
,用于JSON自动
,JSON\u查询
,等等
什么都不管用<代码>对于JSON路径似乎不适用于多个嵌套集合
我如何得到这个结果 您需要像平常一样使用联接。 使用FOR JSON AUTO将选择连接别名,如果您想要更多控制,请使用FOR JSON路径
SELECT
ent.Id AS 'Id',
ent.Name AS 'Name',
ent.Age AS 'Age',
EMails = (
SELECT
Emails.Id AS 'Id',
Emails.Email AS 'Email'
FROM EntitiesEmails Emails WHERE Emails.EntityId = ent.Id
FOR JSON PATH
)
FROM Entities ent
FOR JSON PATH
我将给您一个通用示例,它将很容易映射到您的场景:
选项1-对于JSON自动:
联接别名将用作嵌套集合属性名称
SELECT
ent.Id AS 'Id',
ent.Name AS 'Name',
ent.Age AS 'Age',
Emails.Id AS 'Id',
Emails.Email AS 'Email'
FROM Entities ent
LEFT JOIN EntitiesEmails Emails ON Emails.EntityId = ent.Id
FOR JSON AUTO
选项2-对于JSON路径:
处理所有内容并注意,内部select必须返回一个字符串,这里也使用FOR JSON PATH
SELECT
ent.Id AS 'Id',
ent.Name AS 'Name',
ent.Age AS 'Age',
EMails = (
SELECT
Emails.Id AS 'Id',
Emails.Email AS 'Email'
FROM EntitiesEmails Emails WHERE Emails.EntityId = ent.Id
FOR JSON PATH
)
FROM Entities ent
FOR JSON PATH
两者生成相同的结果:
[{
"Id": 1,
"Name": "Alex",
"Age": 35,
"Emails": [{
"Id": 1,
"Email": "abc@domain.com"
}, {
"Id": 2,
"Email": "def@domain.com"
}, {
"Id": 3,
"Email": "ghi@domain.net"
}]
}, {
"Id": 2,
"Name": "Another Ale",
"Age": 40,
"Emails": [{
"Id": 4,
"Email": "user@skdfh.com"
}, {
"Id": 5,
"Email": "asldkj@als09q834.net"
}]
}, {
"Id": 3,
"Name": "John Doe",
"Age": 33,
"Emails": [{
"Id": 6,
"Email": "ooaoasdjj@ksjsk0913.org"
}]
}, {
"Id": 4,
"Name": "Mario",
"Age": 54,
"Emails": [{}]
}]
干杯 如果有多个表在关系方面类似于
电子邮件
,则会导致自动
方式的行为与预期不符,因此应为此类情况选择路径
方式。更不用说我觉得它更优雅了。我们注意到,在这种特殊情况下,选项1的性能更好。Sql Server 2012怎么样?Sql Server 2012不支持“for JSON”,所以这些都不适用。此功能仅在SQL Server 2016中引入。不过,您可以使用“FOR XML”,并获得类似的结果,但可以用XML序列化。
[{
"Id": 1,
"Name": "Alex",
"Age": 35,
"Emails": [{
"Id": 1,
"Email": "abc@domain.com"
}, {
"Id": 2,
"Email": "def@domain.com"
}, {
"Id": 3,
"Email": "ghi@domain.net"
}]
}, {
"Id": 2,
"Name": "Another Ale",
"Age": 40,
"Emails": [{
"Id": 4,
"Email": "user@skdfh.com"
}, {
"Id": 5,
"Email": "asldkj@als09q834.net"
}]
}, {
"Id": 3,
"Name": "John Doe",
"Age": 33,
"Emails": [{
"Id": 6,
"Email": "ooaoasdjj@ksjsk0913.org"
}]
}, {
"Id": 4,
"Name": "Mario",
"Age": 54,
"Emails": [{}]
}]