JSON_OBJECT (Transact-SQL)

适用于:SQL Server 2022 (16.x) Azure SQL 数据库Azure SQL 托管实例

从零个或多个表达式中构造 JSON 对象文本。

语法

JSON_OBJECT ( [ <json_key_value> [,...n] ] [ json_null_clause ] )

<json_key_value> ::= json_key_name : value_expression

<json_null_clause> ::=
      NULL ON NULL
    | ABSENT ON NULL

参数

json_key_name

是定义 JSON 键名称值的字符表达式。

value_expression 是定义 JSON 键值的表达式。

json_null_clause

可用于控制 JSON_OBJECT 函数在 value_expressio 为 NULL 时的行为。 在生成 JSON 键值时,选项 NULL ON NULL 将 SQL NULL 值转换为 JSON NUL 值。 如果值为 ABSENT ON NULL,选项 NULL 将省略整个键。 此选项的默认设置为 NULL ON NULL

返回值

返回 nvarchar(max) 类型的有效 JSON 对象字符串。

若要了解 JSON_OBJECT 函数的输出内容,请查看以下文章:

示例

示例 1

以下示例返回空 JSON 对象。

SELECT JSON_OBJECT();

结果

{}

示例 2

以下示例返回包含两个键的 JSON 对象。

SELECT JSON_OBJECT('name':'value', 'type':1)

结果

{"name":"value","type":1}

示例 3

以下示例返回包含一个键的 JSON 对象,因为其中一个键的值为 NULL,并且指定了 ABSENT ON NULL 选项。

SELECT JSON_OBJECT('name':'value', 'type':NULL ABSENT ON NULL)

Result

{"name":"value"}

示例 4

以下示例返回包含两个键的 JSON 对象。 一个键包含 JSON 字符串,另一个键包含 JSON 数组。

SELECT JSON_OBJECT('name':'value', 'type':JSON_ARRAY(1, 2))

结果

{"name":"value","type":[1,2]}

示例 5

以下示例返回包含两个键的 JSON 对象。 一个键包含 JSON 字符串,另一个键包含 JSON 对象。

SELECT JSON_OBJECT('name':'value', 'type':JSON_OBJECT('type_id':1, 'name':'a'))

结果

{"name":"value","type":{"type_id":1,"name":"a"}}

示例 6

以下示例返回 JSON 对象,其输入指定为变量或 SQL 表达式。

DECLARE @id_key nvarchar(10) = N'id',@id_value nvarchar(64) = NEWID();
SELECT JSON_OBJECT('user_name':USER_NAME(), @id_key:@id_value, 'sid':(SELECT @@SPID))

结果

{"user_name":"dbo","id":"E2CBD8B4-13C1-4D2F-BFF7-E6D722F095FD","sid":63}

示例 7

以下示例在查询中对每行返回一个 JSON 对象。

SELECT s.session_id, JSON_OBJECT('security_id':s.security_id, 'login':s.login_name, 'status':s.status) as info
FROM sys.dm_exec_sessions AS s
WHERE s.is_user_process = 1;

Result

session_id info
51 {"security_id":"AQYAAAAAAAVQAAAAY/0dmFnai5oioQHh9eNArBIkYd4=","login":"NT SERVICE\\SQLTELEMETRY$SQL22","status":"sleeping"}
52 {"security_id":"AQUAAAAAAAUVAAAAoGXPfnhLm1/nfIdwAMgbAA==","login":WORKGROUP\\sqluser","status":"running"}