Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 输出内部包含多个数组的JSON_Sql Server - Fatal编程技术网

Sql server 输出内部包含多个数组的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

我试图将查询输出为带有多个数组的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')
我希望生成的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对象。默认情况下,使用and
lax
模式,从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中使用?@Milacay
person_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"}]}]