JSON_OBJECTAGG(Transact-SQL)

适用于:Microsoft Fabric 中的 SQL Server 2025 (17.x) Azure SQL 数据库Azure SQL 托管实例 SQL 数据库

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

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

Note

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

json 聚合函数JSON_OBJECTAGGJSON_ARRAYAGG以下函数:

  • 适用于 Azure SQL 数据库、Azure SQL 托管实例(SQL Server 2025Always-up-to-dateupdate policy**)、Microsoft Fabric 和 Fabric 数据仓库中的 SQL 数据库。

  • SQL Server 2025 (17.x) 预览版。

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;

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

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

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

结果

{"a":1}

结果集如下。

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}

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

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

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}