用途:在 Azure SQL Database 上查询和存储 JSON,比较旧式 nvarchar(max) 加函数与原生 json 类型两种方案。
主要能力与差异:json 类型在插入时校验非法 JSON,报 Msg 13609;nvarchar(max) 静默接受。json 列可建 CREATE JSON INDEX(每列一个、每表 249 个,默认路径为 $,路径不可重叠,离线构建),支持 JSON_PATH_EXISTS、JSON_CONTAINS 及 JSON_VALUE 的等值比较和 RETURNING,但不支持 LIKE、IS [NOT] NULL,也禁止 =、ORDER BY、GROUP BY、DISTINCT(Msg 402、13636、421、8116)。json 列会重新格式化并丢弃重复键,不再逐字节保留原文。须保留文字时可用 CHECK (ISJSON(payload) = 1)。
使用方式:OPENJSON 应显式写 WITH 模式,否则只返回 key(BIN2 排序规则)、value(nvarchar(max))和 type;WITH 可返回所需类型列并让坏值报错(如 Msg 245)。嵌套对象或数组需加 AS JSON,且只能配 nvarchar(max),否则报 Msg 13618。路径与 key 区分大小写,宽松模式缺失属性为 NULL,严格模式报 Msg 13608。JSON_VALUE 不带 RETURNING 时上限 nvarchar(4000),超长在宽松模式返回 NULL、严格模式报 Msg 13625,可用 RETURNING nvarchar(max) 或 OPENJSON WITH 绕开。OPENJSON 需兼容级别 130,可用 SELECT DATABASEPROPERTYEX(DB_NAME(), 'CompatibilityLevel') 查看,或启用 ALLOW_BUILTIN_TVF_IN_ALL_COMPAT_LEVELS。
适用场景与限制:标量读取 nvarchar(max) 可能更省,多字段展开用 OPENJSON WITH 更快;列转 json 存在非法行会失败(Msg 13609),反向就地转换被拒绝(Msg 257)。