適用於: SQL Server 2025 (17.x)
Azure SQL Database Azure
SQL Managed Instance
SQL database in Microsoft Fabric
語法 JSON_OBJECTAGG 會從 SQL 資料或數據行的匯總建構 JSON 物件。
JSON_OBJECTAGG 也可以在語句中 SELECT 搭配 子 GROUP BY GROUPING SETS 句使用。
索引鍵/值組可以指定為輸入值、資料行、變數參考。
Note
若要改為從彙總建立 JSON 陣列,請使用 JSON_ARRAYAGG。
json 彙總函數JSON_OBJECTAGG和JSON_ARRAYAGG都是:
正式適用於 Azure SQL 資料庫、Azure SQL 受控執行個體 (具有 SQL Server 2025 或 Always-up-to-date更新原則**)、Microsoft Fabric 中的 SQL 資料庫,以及 Fabric Data Warehouse。
SQL Server 2025(17.x)預覽版。
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。 前兩個數據行會傳回 id 和 type 數據行值。 第三個數據行total_amount會傳回數據行上的SUM匯總值amount。 第四個數據行json_total_name_amount會傳回 和 JSON_OBJECTAGG 數據行上的name匯總值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} |