Sql server 输出内部包含多个数组的JSON
我试图将查询输出为带有多个数组的JSON格式,但无法使其正常工作。我遇到了这个问题,但它并不是我想要的结果 以下是示例表:Sql server 输出内部包含多个数组的JSON,sql-server,Sql Server,我试图将查询输出为带有多个数组的JSON格式,但无法使其正常工作。我遇到了这个问题,但它并不是我想要的结果 以下是示例表: DECLARE @Persons AS TABLE ( person_id int primary key, person_name varchar(20) ) DECLARE @Pets AS TABLE ( pet_owner int, -- in real tables, this would be a foreign key to Pers
DECLARE @Persons AS TABLE
(
person_id int primary key,
person_name varchar(20)
)
DECLARE @Pets AS TABLE
(
pet_owner int, -- in real tables, this would be a foreign key to Person.person_id
pet_id int primary key,
pet_name varchar(10)
)
INSERT INTO @Persons (person_id, person_name) VALUES
(2, 'Jack'),
(3, 'Jill')
INSERT INTO @Pets (pet_owner, pet_id, pet_name) VALUES
(2, 4, 'Bug'),
(2, 5, 'Feature'),
(3, 6, 'Fiend')
我希望生成的JSON输出如下所示:
[{
"2" : [{
"pet_id" : 4,
"name" : "Bug",
},
{
"pet_id" : 5,
"name" : "Feature",
}
],
"3" : [{
"pet_id" : 6,
"name" : "Fiend",
}
]
}]
如果JSON路径的常规内置
选项不可行,我也会采取任何技巧,如串联等。我不认为您可以仅使用JSON AUTO的,
/为JSON路径的生成带有变量键名的JSON输出
对于SQL Server 2016+来说,一个可能的解决方案是对JSON AUTO使用,对XML PATH使用
对于SQL Server 2017+,您可以仅使用JSON函数从JSON数组开始生成预期输出,其中第一项包含一个空JSON对象。默认情况下,使用andlax
模式,从JSON AUTO
的生成的JSON输出被插入为键的值,由CONCAT(“$[0]”,person_id“”)
expression指定(SQL Server 2017支持将表达式用作path
参数的值)。老实说,JSON\u QUERY()
在这里是不需要的,但是作为规则,JSON\u MODIFY()
会转义新值中的所有特殊字符。在这种情况下,您需要使用FOR JSON
,JSON\u QUERY()
或JSON\u MODIFY()
(JSON\u QUERY(person\u JSON,“$”)
返回整个JSON)获取格式正确的JSON
表:
DECLARE @Persons AS TABLE (
person_id int primary key,
person_name varchar(20)
)
DECLARE @Pets AS TABLE (
pet_owner int, -- in real tables, this would be a foreign key to Person.person_id
pet_id int primary key,
pet_name varchar(10)
)
INSERT INTO @Persons
(person_id, person_name)
VALUES
(2, 'Jack'),
(3, 'Jill')
INSERT INTO @Pets
(pet_owner, pet_id, pet_name)
VALUES
(2, 4, 'Bug'),
(2, 5, 'Feature'),
(3, 6, 'Fiend')
声明(SQL Server 2016+):
声明(SQL Server 2017+):
结果:
[{"2":[{"pet_id":4,"name":"Bug"},{"pet_id":5,"name":"Feature"}],"3":[{"pet_id":6,"name":"Fiend"}]}]
它起作用了。非常感谢你。如果您不介意的话,请解释一下第二种解决方案,其中有JSON\u MODIFY
,JSON\u QUERY
。$
是什么意思?我还在学习,非常感谢你花时间解释。再次感谢!最后一个问题。在Cross Apply语句的末尾,它有一个名为j(person\u json)
的派生表。我理解通常用于交叉申请的j
,但从未见过“(person_json)”第二部分。您是否将其存储在变量中,以便稍后在JSON_Modify中使用?@Milacayperson_JSON
是j
派生表中列的列别名。
DECLARE @json varchar(max) = '[{}]'
SELECT @json = JSON_MODIFY(
@json,
CONCAT('$[0]."', person_id, '"'),
--JSON_QUERY(person_json, '$')
person_json
)
FROM @Persons p
CROSS APPLY (
SELECT pet_id, pet_name AS name
FROM @Pets
WHERE pet_owner = p.person_id
FOR JSON AUTO
) j (person_json)
SELECT @json
[{"2":[{"pet_id":4,"name":"Bug"},{"pet_id":5,"name":"Feature"}],"3":[{"pet_id":6,"name":"Fiend"}]}]