使用OPENJSON解析货币JSON时WITH子句失效,如何提取Code和Name?
解决OPENJSON WITH子句解析Code/Name字段的问题
1. 先明确JSON结构类型
OPENJSON的WITH子句失效,大概率是JSON结构和路径不匹配,先区分两种常见场景:
场景1:JSON是多元素数组(多数货币数据的格式)
如果你的JSON是数组结构,比如:
[ {"code": "USD", "name": "United States Dollar"}, {"code": "BTC", "name": "Bitcoin"}, {"code": "EUR", "name": "Euro"} ]
需要让OPENJSON先遍历数组元素,再用WITH子句指定子对象的字段路径:
DECLARE @json NVARCHAR(MAX) = N'[ {"code": "USD", "name": "United States Dollar"}, {"code": "BTC", "name": "Bitcoin"}, {"code": "EUR", "name": "Euro"} ]'; SELECT Code, Name FROM OPENJSON(@json) WITH ( Code VARCHAR(50) '$.code', Name VARCHAR(100) '$.name' );
这里OPENJSON(@json)负责解析数组的每个元素,WITH里的$.code是相对于每个子对象的路径,能正确提取字段。
场景2:JSON是单个对象
如果是单条货币数据的对象结构:
{"code": "USD", "name": "United States Dollar"}
直接用WITH子句绑定根路径即可,或者用更简洁的JSON_VALUE写法:
DECLARE @json NVARCHAR(MAX) = N'{"code": "USD", "name": "United States Dollar"}'; -- 方法1:OPENJSON + WITH SELECT Code, Name FROM OPENJSON(@json) WITH ( Code VARCHAR(50) '$.code', Name VARCHAR(100) '$.name' ); -- 方法2:直接用JSON_VALUE(单对象更高效) SELECT JSON_VALUE(@json, '$.code') AS Code, JSON_VALUE(@json, '$.name') AS Name;
2. 常见错误排查
- 大小写不匹配:OPENJSON默认区分大小写,比如JSON里字段是
Code,你写$.code就会取不到值,要严格对应。 - JSON格式无效:先用
ISJSON(@json)验证合法性,返回1表示有效,0表示JSON有语法错误:SELECT ISJSON(@json) AS IsValidJson; - 版本不支持:确保你的SQL Server版本是2016及以上,或使用Azure SQL Database(OPENJSON是2016才引入的功能)。
3. 嵌套JSON的处理
如果JSON有外层包装(比如嵌套在data节点下):
{"data": [ {"code": "USD", "name": "United States Dollar"}, {"code": "BTC", "name": "Bitcoin"} ]}
需要调整OPENJSON的路径到数组所在位置:
DECLARE @json NVARCHAR(MAX) = N'{"data": [ {"code": "USD", "name": "United States Dollar"}, {"code": "BTC", "name": "Bitcoin"} ]}'; SELECT Code, Name FROM OPENJSON(@json, '$.data') WITH ( Code VARCHAR(50) '$.code', Name VARCHAR(100) '$.name' );
内容的提问来源于stack exchange,提问作者Russ
相关产品推荐
相关产品推荐

