SQL Server 2016中JSON字符串字段提取为列的查询问题
解决JSON字段提取问题
看起来你在提取嵌套JSON字段时踩了两个常见的坑:路径层级不对和JSON键的大小写不匹配。咱们一步步来修正:
首先看你的JSON结构,它的层级是:
{
"Microsoft.Resources":{
"resourceUri":"/subscriptions/123subscription123/resourceGroups/123resourcegroup123/providers/Microsoft.Storage/storageAccounts/123storagaccount123",
"location":"euwest"
}
}
要提取的字段都嵌套在Microsoft.Resources这个顶层属性里,而且JSON是严格区分大小写的——你的JSON里是小写的location,不是你查询里写的大写Location。
方案1:直接用JSON_VALUE访问完整路径(最简单)
假设你的表中存储这个JSON的列名为JsonData,直接通过完整的JSON路径定位字段即可:
SELECT JSON_VALUE(JsonData, '$.Microsoft.Resources.resourceUri') AS resourceUri, JSON_VALUE(JsonData, '$.Microsoft.Resources.location') AS Location FROM YourTableName;
方案2:用OPENJSON解析嵌套对象
如果需要更灵活地处理嵌套结构,可以通过两次CROSS APPLY OPENJSON来逐层解析:
SELECT res.resourceUri, res.location AS Location FROM YourTableName CROSS APPLY OPENJSON(JsonData) WITH ( -- 先解析顶层的Microsoft.Resources属性,把它当作JSON对象处理 [Microsoft.Resources] NVARCHAR(MAX) AS JSON ) AS rootObj -- 再解析内层的Microsoft.Resources对象,直接映射字段 CROSS APPLY OPENJSON(rootObj.[Microsoft.Resources]) WITH ( resourceUri NVARCHAR(2000), location NVARCHAR(50) ) AS res;
你原来查询的问题点
- 没有指定
Microsoft.Resources这个顶层节点,导致JSON_VALUE找不到对应的字段路径; - JSON键大小写不匹配:你的JSON里是
location,但你写的是$.Location,这会返回NULL。
内容的提问来源于stack exchange,提问作者JVGBI
相关产品推荐
相关产品推荐

