JSON_OBJECTAGG(Transact-SQL)

适用于:Microsoft FabricSQL Microsoft 数据库中Microsoft Fabric 和 Warehouse 中的 Azure SQL 数据库 Azure SQL 数据库Azure SQL 托管实例 SQL 分析终结点,SQL Server 2025 (17.x)

该 JSON_OBJECTAGG 语法从 SQL 数据或列的聚合构造 JSON 对象。 JSON_OBJECTAGG也可以在包含SELECT子句的GROUP BY GROUPING SETS语句中使用。

键值对可以被指定为输入值、列、变量引用。

Note

若要改为从聚合创建 JSON 数组,请使用 JSON_ARRAYAGG。

Transact-SQL 语法约定

Syntax

JSON_OBJECTAGG ( json_key_value [ json_null_clause ] [ RETURNING JSON ] )

json_key_value ::= <json_name> : <value_expression>

json_null_clause ::= NULL ON NULL | ABSENT ON NULL

Arguments

json_key_value

JSON 对象的键值对。

json_null_clause

Optional. 如果值为 NULL,则省略对象的整个属性,或使用 JSON null 作为属性值。 如果省略,则 NULL ON NULL 为默认值。

返回值

返回 nvarchar(max) 类型的有效 JSON 对象字符串。 如果包含该 RETURNING JSON 选项,则 JSON 对象将作为 json 类型返回。

Examples

A. 返回包含一个键的 JSON 对象

以下示例返回包含一个键和 null 值的 JSON 对象。

SELECT JSON_OBJECTAGG('key':NULL);

结果集如下。

{"key":null}

B. 从结果集中构造 JSON 对象

以下示例使用结果集中的三个属性来构造 JSON 对象。

SELECT JSON_OBJECTAGG(c1:c2)
FROM (
    VALUES('key1', 'c'), ('key2', 'b'), ('key3', 'a')
) AS t(c1, c2);

结果集如下。

{"key1":"c","key2":"b","key3":"a"}

C. 返回包含两列的结果

以下示例返回包含两列的结果。 第一列包含 object_id 值。 第二列包含一个 JSON 对象,其中键为列名,值为 column_id。

SELECT TOP (5) c.object_id,
               JSON_OBJECTAGG(c.name:c.column_id) AS columns
FROM sys.columns AS c
GROUP BY c.object_id;

结果集如下。

object_id column_list
3 {"bitpos":12,"cid":6,"colguid":13,"hbcolid":3,"maxinrowlen":8,"nullbit":11,"offset":10,"ordkey":7,"ordlock":14,"rcmodified":4,"rscolid":2,"rsid":1,"status":9,"ti":5}
5 {"cmprlevel":9,"fgidfs":7,"fillfact":10,"idmajor":3,"idminor":4,"lockres":17,"maxint":13,"maxleaf":12,"maxnullbit":11,"minint":15,"minleaf":14,"numpart":5,"ownertype":2,"rcrows":8,"rowsetid":1,"rsguid":16,"scope_id":18,"status":6}
6 {"cloneid":6,"dbfragid":8,"id":1,"partid":3,"rowsetid":7,"segid":5,"status":9,"subid":2,"version":4}
7 {"auid":1,"fgid":5,"ownerid":3,"pcdata":10,"pcreserved":11,"pcused":9,"pgfirst":6,"pgfirstiam":8,"pgroot":7,"status":4,"type":2}
8 {"fileid":2,"filename":4,"name":3,"status":1}

D. 将 JSON 对象作为 JSON 类型返回

以下示例将 JSON 对象作为 json 类型返回。

SELECT JSON_OBJECTAGG('a':1 RETURNING JSON);

结果

{"a":1}

E. 返回包含四列的聚合结果

以下示例返回一个结果,其中包含一个 SELECT 语句 SUM 中的四列,其中包含和 JSON_OBJECTAGG 聚合的列 GROUP BY GROUPING SETS。 前两列返回和idtype列值。 第三列total_amount返回列上的SUM聚合值amount。 第四列json_total_name_amount返回对列JSON_OBJECTAGGname的amount聚合值。

WITH T
AS (SELECT *
    FROM (
        VALUES (1, 'k1', 'a', 2), (1, 'k2', 'b', 3), (1, 'k3', 'b', 4), (2, 'j1', 'd', 7), (2, 'j2', 'd', 9)
    ) AS b(id, name, type, amount))
SELECT id,
       type,
       SUM(amount) AS total_amount,
       JSON_OBJECTAGG(name:amount) AS json_total_name_amount
FROM T
GROUP BY GROUPING SETS((id), (type), (id, type), ());

结果集如下。

id 类型 total_amount json_total_name_amount
1 a 2 {"k1":2}
NULL a 2 {"k1":2}
1 b 7 {"k3":4,"k2":3}
NULL b 7 {"k3":4,"k2":3}
2 d 16 {"j2":9,"j1":7}
NULL d 16 {"j2":9,"j1":7}
NULL NULL 25 {"k1":2,"k3":4,"k2":3,"j2":9,"j1":7}
1 NULL 9 {"k2":3,"k3":4,"k1":2}
2 NULL 16 {"j2":9,"j1":7}