JSON 数据类型

适用于:Microsoft Fabric 中的 SQL Server 2025 (17.x) 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

JSON数据类型通常可在2025 SQL Server(17.x)、Azure SQL 数据库、Azure SQL 托管实例 SQL Server 2025或Always-up-to-date更新策略中提供,SQL数据库则在Fabric中提供。

modify 方法

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 对象或 JSON 数组。 不支持标量、布尔值和 NULL 值。 JSON 数据类型符合 IETF RFC 4627,它只允许 JSON 对象或数组。 json 数据类型和所有 JSON 函数仅适用于符合 IETF RFC 4627 的 JSON 文档。

ISJSON 函数可用于验证包含 JSON 文档的字符串符合 IETF RFC 8259。 IETF RFC 8259 一致性 JSON 文档仅包含顶级 JSON 标量值。

例如:

DECLARE @true JSON = 'true'; -- invalid
DECLARE @false JSON = 'false'; -- invalid
DECLARE @number JSON = '1234.56'; -- invalid
DECLARE @string JSON = '"contoso"'; -- invalid
DECLARE @null JSON = 'null' -- invalid

DECLARE @null JSON = NULL -- valid
DECLARE @object JSON = '{}' -- valid
DECLARE @array JSON = '[]' -- valid

函数支持

所有 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 列转换为任何字符串或二进制类型。

有关详细信息,请参阅数据类型转换(数据库引擎)。

Compatibility

json 数据类型可用作用户定义函数中的参数或返回类型,也可以用作存储过程的参数。 json 类型与触发器和视图兼容。

目前,bcp 工具的本机格式将 json 文档包含为 varchar 或 nvarchar。 必须指定格式化文件来指定 json 列。

不允许为 CREATE TYPEjson 数据类型创建别名类型。 此行为与 xml 数据类型相同。

与 SELECT ... INTOjson 数据类型一起使用将创建包含 json 类型的表。

Limitations

返回 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)。

大小限制

存储中 JSON 数据的大小限制:

领域 限度
JSON 数据类型大小 (二进制) 最多 2GB
唯一键数 最多 32K
每个键字符串大小 7998 字节
每个字符串值大小 536870911 字节
一个对象中的属性数 最多 65535
一个数组中的元素数 最多 65535
JSON 文档中的嵌套级别数 128