我想从 SQL Server 2016 中存储为 nvarchar 值的任意格式良好的 JSON 文档中提取节点名称及其路径的完整列表。有没有可靠的方法来做到这一点?
例如,对于 json 值:
DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'
在查询 @json_doc 时得到这个结果:
NODE_NAME
$.Name1
$.Name2
我想从 SQL Server 2016 中存储为 nvarchar 值的任意格式良好的 JSON 文档中提取节点名称及其路径的完整列表。有没有可靠的方法来做到这一点?
例如,对于 json 值:
DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'
在查询 @json_doc 时得到这个结果:
NODE_NAME
$.Name1
$.Name2
从默认的 OPENJSON 模式中选择 [key] 。
dbfiddle在这里
添加到这个答案。
获取列中的所有 JSON 键:
例如, 表:
查询结果:
获取所有 JSON 键,其中 JSON 是对象数组:
表:
查询结果:
使用递归 CTE 显示一切。类型 4 和 5(来自 OPENJSON 函数的结果)分别是数组和 sub_json。其他类型是原子值。查询返回 json 变量中每个元素的完整路径、值、键和类型。
原始问题将返回:
如果您使用数字作为键,例如: SET @json_doc ='{"1":"Value1", "2":"Value2"}'; 结果会出错:
这里的问题是我使用 IIF(TRY_CAST([Key] AS int) 来识别数组索引并且没有命名项。可以采取一些技巧来防止它,但我不想让这件事过于复杂。(并使用数字作为键名在我看来是个坏主意)。在一个更复杂的例子中(来自http://www.json.org/example.html)
结果(为清楚起见省略值):