SQLServer2022新特性JSON_OBJECT从零个或多个表达式中构造 JSON 对象文本
参考中文官方文档
https://learn.microsoft.com/zh-cn/sql/t-sql/functions/json-object-transact-sql?view=sql-server-ver16
参考英文文官方文档
https://learn.microsoft.com/en-us/sql/t-sql/functions/json-object-transact-sql?view=sql-server-ver16
1、本文内容
- 语法
- 参数
- 返回值
- 示例
适用于:
- SQL Server 2022 (16.x)
- Azure SQL 数据库
- Azure SQL 托管实例
从零个或多个表达式中构造 JSON 对象文本。
2、语法
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
复制
3、参数
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。
4、返回值
返回 nvarchar(max) 类型的有效 JSON 对象字符串。
若要了解 JSON_OBJECT 函数的输出内容,请查看以下文章:
FOR JSON 如何将 SQL Server 数据类型转换为 JSON 数据类型 (SQL Server)
JSON_OBJECT 函数使用这篇 FOR JSON 文章中描述的规则在 JSON 输出中将 SQL 数据类型转换为 JSON 类型。
FOR JSON 如何转义特殊字符和控制字符 (SQL Server)
JSON_OBJECT 函数按照这篇 FOR JSON 文章中描述的方式在 JSON 输出中转义特殊字符和表示控制字符。
https://learn.microsoft.com/en-us/sql/relational-databases/json/how-for-json-converts-sql-server-data-types-to-json-data-types-sql-server?view=sql-server-ver16
https://learn.microsoft.com/en-us/sql/relational-databases/json/how-for-json-escapes-special-characters-and-control-characters-sql-server?view=sql-server-ver16
5、示例
5.1、返回空 JSON 对象
以下示例返回空 JSON 对象
SELECT JSON_OBJECT() AS return_json; return_json ----------------------------------------------- {} (1 行受影响)
复制
5.2、返回包含两个键的 JSON 对象
以下示例返回包含两个键的 JSON 对象
DECLARE @name NVARCHAR(50) = 'SQLServer2022'; DECLARE @age INT = 88; SELECT JSON_OBJECT('name':@name, 'age':@age) AS return_json; return_json ----------------------------------------------------------- {"name":"SQLServer2022","age":88} (1 行受影响)
复制
5.3、返回包含一个键的 JSON 对象,其中一个键的值为 NULL
以下示例返回包含一个键的 JSON 对象,因为其中一个键的值为 NULL,并且指定了 ABSENT ON NULL 选项。
SELECT JSON_OBJECT('name':'value', 'type':NULL ABSENT ON NULL) AS return_json; return_json -------------------------------------------------- {"name":"value"} (1 行受影响)
复制
以下示例返回包含一个键的 JSON 对象,因为其中一个键的值为 NULL,并且指定了 NULL ON NULL 选项。
-- NULL ON NULL 选项 为默认值 SELECT JSON_OBJECT('name':'value', 'type':NULL) AS return_json; -- OR SELECT JSON_OBJECT('name':'value', 'type':NULL NULL ON NULL) AS return_json; return_json ---------------------------------------------------- {"name":"value","type":null} (1 行受影响)
复制
5.4、返回包含两个键的 JSON 对象包括字符串和JSON 数组
以下示例返回包含两个键的 JSON 对象。 一个键包含 JSON 字符串,另一个键包含 JSON 数组。
SELECT JSON_OBJECT('id':1, 'info':JSON_ARRAY('SQLNode1,DBadmin')) AS return_json; return_json -------------------------------------------------------- {"id":1,"info":["SQLNode1,DBadmin"]} (1 行受影响)
复制
5.5、返回包含两个键的 JSON 对象包含字符串和JSON 对象
以下示例返回包含两个键的 JSON 对象。 一个键包含 JSON 字符串,另一个键包含 JSON 对象。
DECLARE @name NVARCHAR(50) = 'NBA Games'; DECLARE @age INT = 30; SELECT JSON_OBJECT('id':'1001', 'info':JSON_OBJECT('name':@name, 'age':@age)) AS return_json; return_json ------------------------------------------------------------------- {"id":"1001","info":{"name":"NBA Games","age":30}} (1 行受影响)
复制
5.6、输入指定为变量或 SQL表达式返回JSON 对象
以下示例返回 JSON 对象,其输入指定为变量或 SQL 表达式。
DECLARE @id_key nvarchar(10) = N'id', @id_value nvarchar(64) = NEWID(); SELECT JSON_OBJECT ( 'username':USER_NAME(), @id_key:@id_value, 'sid':(SELECT @@SPID), 'sys_date':(SELECT GETDATE()) ) AS return_json; return_json ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"username":"dbo","id":"7105CD3C-041F-4CEC-AA98-0621F008C3B8","sid":68,"sys_date":"2024-05-29T09:47:01.893"} (1 行受影响)
复制
5.7、在查询中对每行返回一个 JSON 对象
以下示例在查询中对每行返回一个 JSON 对象。
-- 创建表及插入数据 CREATE TABLE Persons ( ID INT PRIMARY KEY, Name NVARCHAR(50), Age INT ); INSERT INTO Persons VALUES (1, 'John Doe', 30); INSERT INTO Persons VALUES (2, 'Jane Smith', 25); -- 查询表数据 SELECT ID,Name,Age FROM Persons; ID Name Age ----------- -------------------------------------------------- ----------- 1 John Doe 30 2 Jane Smith 25 (2 行受影响) -- Result SELECT ID, JSON_OBJECT('name':Name, 'age':Age) AS PersonJson FROM Persons; ID personJson ----------- --------------------------------------------------- 1 {"name":"John Doe","age":30} 2 {"name":"Jane Smith","age":25} (2 行受影响)
复制