适用于:SQL Server 2025 (17.x) 在
Microsoft Fabric 预览版中预览
Azure SQL 数据库
Azure SQL 托管实例 SQL 数据库
json 数据类型以本机二进制格式存储 JSON 文档。
json 类型提供经过优化的 JSON 文档的高保真存储,以便轻松进行查询和作,并提供以下优势:将 JSON 数据存储为 varchar 或 nvarchar:
- 提高读取效率,因为文档已经过分析
- 提高写入效率,因为查询可以在不访问整个文档的情况下更新单个值
- 提高存储效率,针对压缩进行优化
- 仍与现有代码相兼容
json 类型使用 UTF-8 编码 Latin1_General_100_BIN2_UTF8 在内部存储数据。 此行为与 JSON 规范相符。
有关查询 JSON 数据的详细信息,请参阅 SQL Server 中的 JSON 数据。
示例语法
json 类型的使用语法类似于表中的所有其他 SQL Server 数据类型。
column_name JSON [ NOT NULL | NULL ] [CHECK ( constraint_expression ) ] [ DEFAULT ( default_expression ) ]
json 数据类型可用于语句中包含的CREATE TABLE列定义中。 例如:
CREATE TABLE Orders
(
order_id INT,
order_details JSON NOT NULL
);
可以将约束指定为列定义的一部分。 例如:
CREATE TABLE Orders
(
order_id INT,
order_details JSON NOT NULL
CHECK (JSON_PATH_EXISTS(order_details, '$.basket') = 1)
);
功能可用性
SQL Server 2016(13.x)中首次引入了 JSON 函数支持。 本机 json 类型是在 Azure SQL 数据库和 Azure SQL 托管实例中引入的,在 SQL Server 2025(17.x) 预览版中也可用。
json 数据类型在所有数据库兼容性级别下可用。
Note
- 适用于具有 SQL Server 2025 或 Always-up-to-date更新策略的 Azure SQL 数据库和 Azure SQL 托管实例。
- 在 Fabric 中预览版 SQL Server 2025 (17.x) 预览版和 SQL 数据库。
modify 方法
Note
该方法 modify 目前为预览版,仅在 SQL Server 2025(17.x) 预览版中可用。
json 数据类型支持modify该方法。 用于 modify 修改存储在列中的 JSON 文档。 此方法 modify 具有优化,可在可能的情况下对数据执行就地修改,并且是修改 json 列中 JSON 文档的首选方法。
对于 JSON 字符串,如果新值小于或等于现有值,则可以就地修改。
对于 JSON 数字,如果新值的类型相同,或位于现有值范围内,则可以就地修改。
DROP TABLE IF EXISTS JsonTable;
CREATE TABLE JsonTable
(
id INT PRIMARY KEY,
d JSON
);
INSERT INTO JsonTable (id, d)
VALUES (1, '{"a":1, "b":"abc", "c":true}');
UPDATE JsonTable
SET d.modify('$.a', 14859)
WHERE id = 1;
UPDATE JsonTable
SET d.modify('$.b', 'def')
WHERE id = 1;
函数支持
所有 JSON 函数都支持 json 数据类型,无需更改代码或使用差异。
-
OPENJSON当前不支持某些平台上的 json 数据类型。 有关详细信息,请参阅 “限制”。
有关 JSON 函数的完整列表,请参阅 JSON 函数。
Indexes
JSON 数据没有特殊的索引类型。
json 类型不能用作 CREATE INDEX 语句中的键列。 但是,json 列可以指定为索引定义中包含的列。 此外,json 列可以出现在筛选索引的 WHERE 子句中。
Conversion
可以使用 CAST 或 CONVERT 从 json 类型以显式方式转换为 char、nchar、varchar 和 nvarchar 类型。 不允许进行所有隐式转换,这类似于 xml 的行为。 同样,只能将 char、 nchar、 varchar 和 nvarchar 显式转换为 json 数据类型。
json 数据类型不能与sql_variant类型一起使用,也不能分配给sql_variant变量或列。 此限制类似于 varchar(max)、varbinary(max)、nvarchar(max)、xml 和基于 CLR 的数据类型。
可以使用 varchar(max) 等现有列转换为 jsonALTER TABLE。 与 xml 数据类型类似,不能使用ALTER TABLE任何字符串或二进制类型将 json 列转换为任何字符串或二进制类型。
有关详细信息,请参阅数据类型转换(数据库引擎)。
Compatibility
json 数据类型可用作用户定义函数中的参数或返回类型,也可以用作存储过程的参数。 json 类型与触发器和视图兼容。
目前,bcp 工具的本机格式将 json 文档包含为 varchar 或 nvarchar。 必须指定格式化文件来指定 json 列。
不允许为 CREATE TYPEjson 数据类型创建别名类型。 此行为与 xml 数据类型相同。
与 SELECT ... INTOjson 数据类型一起使用将创建包含 json 类型的表。
Limitations
返回 json 数据类型的行为CAST ( ... AS JSON),但sp_describe_first_result_set系统存储过程无法正确返回 json 数据类型。 因此,许多数据访问客户端和驱动程序都会看到 varchar 或 nvarchar 数据类型。
- 目前,TDS >= 7.4(使用 UTF-8),varchar(max)
Latin_General_100_bin2_utf8。 - 目前,TDS < 7.4 看到具有数据库排序规则的 nvarchar(max)。
目前,该 OPENJSON() 函数不接受某些平台中的 json 数据类型。 目前,它是隐式转换。 首先以显式方式转换为 nvarchar(max)。
- 在 SQL Server 2025(17.x) 预览版中,函数
OPENJSON()支持 json。 有关详细信息,请参阅 SQL Server 2025 中的关键 JSON 功能。