适用于:Microsoft Fabric 中的 SQL Server 2025 (17.x)
Azure SQL 数据库
Azure SQL 托管实例 SQL 数据库
json 数据类型以二进制格式存储 JSON 文档。
JSON 类型为查询和操作优化的 JSON 文档提供了高保真存储。 它相比以 varchar 或 nvarchar形式存储JSON数据,具有以下优势:
- 读取更高效,因为文档已经被解析完成。
- 写入更高效,因为查询可以更新单个值而无需访问整个文档。
- 更高效的存储,优化压缩。
- 与现有代码的兼容性没有变化。
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 ) ]
在语句中包含的CREATE TABLE列定义中使用json数据类型。 例如:
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)
);
功能可用性
对 JSON 函数的支持是在 SQL Server 2016(13.x)中引入的。 内置的json数据类型可在Azure SQL 数据库、Azure SQL 托管实例和SQL Server 2025(17.x)中使用。
有关SQL Server 2025(17.x)中JSON支持的更多信息,请参见SQL Server 2025的关键JSON能力。
json 数据类型在所有数据库兼容性级别下可用。
Note
json 数据类型和 JSON 索引通常可在 2025 SQL Server(17.x)、Azure SQL 数据库、Azure SQL 托管实例(SQL Server 2025 或 Always-up-to-date更新策略,以及 SQL 数据库Microsoft Fabric提供。
modify 方法
json 数据类型支持modify该方法。 用于 modify 更改存储在列中的JSON文档。 该 modify 方法包括在可能的情况下对数据进行原地修改的优化。 这是修改 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 对象或数组。
使用 ISJSON 函数测试字符串是否包含有效的 JSON。 没有类型约束时, ISJSON 顶层只接受 JSON 对象或数组,与 json 数据类型相同。
VALUE类型约束允许顶层的任何JSON值,包括标量值,正如IETF RFC 8259所允许的。
ARRAY, OBJECT, 和SCALAR类型约束只接受该类型。
例如:
DECLARE @true AS JSON = 'true'; -- invalid
DECLARE @false AS JSON = 'false'; -- invalid
DECLARE @number AS JSON = '1234.56'; -- invalid
DECLARE @string AS JSON = '"contoso"'; -- invalid
DECLARE @null AS JSON = 'null'; -- invalid
DECLARE @null AS JSON = NULL; -- valid
DECLARE @object AS JSON = '{}'; -- valid
DECLARE @array AS JSON = '[]'; -- valid
函数支持
所有 JSON 函数都支持 json 数据类型,无需代码更改。
有关 JSON 函数的完整列表,请参阅 JSON 函数。
Indexes
json列可以是索引定义中包含的列,也可以出现在WHERE过滤索引的从句中。
json列不能用作标准索引中的键列。
有关详细信息,请参阅 CREATE INDEX。
在Azure SQL 数据库、Azure SQL 托管实例、SQL Server 2025(17.x)以及Microsoft Fabric中的SQL数据库中,你可以创建JSON索引来优化访问JSON文档中值的查询。
有关详细信息,请参阅 CREATE JSON INDEX。
Conversion
从 json 转换为 char、 nchar、 varchar 和 nvarchar 必须是显式的。 使用 CAST 或 CONVERT。
从 char、 nchar、 varchar、 nvarchar 和 向量 转换为 json 可以是隐式的,也可以是显式的。 从 json 到 矢量 的转换也可以是隐式的,也可以是显式的。
不允许在 JSON 和其他所有数据类型之间转换。
你转换成 json 的值必须是JSON对象或JSON数组。 JSON标量,如 1、 "abc"、 true或 null,会导致错误13609。 空字符串还会导致错误 13609。 如果对象有重复键, json 保留第一个值,丢弃其他值。 不会发生错误。
从 JSON 转换为字符串类型时,返回的 JSON 文本没有无显著的空白。 如果目标长度对JSON文本来说过短,则会出现错误13639。 价值没有被截断。
json 数据类型不能与sql_variant类型一起使用,也不能分配给sql_variant变量或列。 这一限制类似于varchar(max)、varbinary(max)、nvarchar(max)、xml以及基于CLR的数据类型。
可以使用 varchar(max) 等现有列转换为 jsonALTER TABLE。 与 xml 数据类型类似,不能使用任何字符串或二进制类型将 ALTER TABLE 列转换为任何字符串或二进制类型。
有关详细信息,请参阅数据类型转换(数据库引擎)。
数值精度
当你从 char、nchar、varchar 或 nvarchar 转换为 json 时,包含 JSON 数字的文本可以根据数字格式进行四舍五入。
如果你需要保持精确度,可以把 JSON 数字指定为小数值。 同样,如果你需要保留JSON文档的文本表示,可以将JSON文档存储为字符串数据类型。
Compatibility
你可以将 json 数据类型用作用户自定义函数中的参数或返回类型,或者作为存储过程的参数。 json 类型与触发器和视图兼容。
目前, BCP 工具的原生格式将 json 数据表示为 varchar 或 nvarchar。 必须指定格式化文件来指定 json 列。
你不能为 json 数据类型创建别 CREATE TYPE名类型。 此行为与 xml 数据类型相同。
与 SELECT ... INTOjson 数据类型一起使用将创建包含 json 类型的表。
Limitations
CAST 并 CONVERT 按预期返回 json 数据类型。
驱动程序限制
如果驱动程序支持 JSONSUPPORT TDS 功能扩展,sp_describe_first_result_set 系统存储过程会正确返回 json 数据类型。 不支持该扩展的驱动请参见 varchar 或 nvarchar 。
支持SqlClient(>= 6.0)和JDBC(>= 13.2.0)。JSONSUPPORT 例如,最新版本的 SQL Server Management Studio(SSMS)使用最新的 SqlClient 驱动,并正确报告结果集元数据中的 json 类型。
- 没有
JSONSUPPORT,TDS >= 7.4(使用UTF-8)报告 varchar(max), 其中Latin1_General_100_BIN2_UTF8。 - 没有
JSONSUPPORT,TDS < 7.4 报告 nvarchar(max) 并进行数据库整合。
大小限制
存储中 JSON 数据的大小限制:
| 领域 | 限度 |
|---|---|
| JSON 数据类型大小 (二进制) | 最多可达2GB |
| 唯一键数 | 最多可达32,000人 |
| 每个键字符串大小 | 7,998字节 |
| 每个字符串值大小 | 536,870,911 字节 |
| 一个对象中的属性数 | 最多可达65,535人 |
| 一个数组中的元素数 | 最多可达65,535人 |
| JSON 文档中的嵌套级别数 | 128 |