SQL Server 2016 可以从 JSON 中提取节点名称吗?

pet*_*411 5 t-sql json sql-server-2016

我想从在 SQL Server 2016 中存储为 nvarchar 值的任何任意的、格式良好的 JSON 文档中提取节点名称及其路径的完整列表。有没有可靠的方法来做到这一点?

例如,对于 json 值:

DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'
Run Code Online (Sandbox Code Playgroud)

查询@json_doc 时得到这个结果:

NODE_NAME
$.Name1
$.Name2
Run Code Online (Sandbox Code Playgroud)

McN*_*ets 9

默认 OPENJSON schema 中选择 [key] 。

DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}';

SELECT [key]
FROM OPENJSON(@json_doc);
GO
Run Code Online (Sandbox Code Playgroud)
| 关键|
| :---- |
| 姓名1 |
| 姓名2 |

dbfiddle在这里


Jon*_*n49 7

添加到这个答案。

获取列中的所有 JSON 键:

SELECT Keys.[key]
FROM dbo.<table_name> t
CROSS APPLY (
    SELECT [key] [key]
    FROM OPENJSON((SELECT t.<column_name>))
) Keys
Run Code Online (Sandbox Code Playgroud)

例如,

+------------------+
| JSONValues       |
+==================+
| {"myKey":1}      |
+------------------+
| {"myOtherKey":1} |
+------------------+
Run Code Online (Sandbox Code Playgroud)

查询结果

+------------+
| Result     |
+============+
| myKey      |
+------------+
| myOtherKey |
+------------+
Run Code Online (Sandbox Code Playgroud)

获取所有 JSON 键,其中 JSON 是对象数组:

SELECT DISTINCT Keys.[key]
FROM dbo.<table_name, sysname, sample_table> t
CROSS APPLY (
    SELECT x.[value] [value]
    FROM OPENJSON((SELECT t.<json_colum_name, sysname, sample_column>)) x
) ArrayJSON
CROSS APPLY (
    SELECT [key] [key]
    FROM OPENJSON((SELECT ArrayJSON.[value])) x
) Keys
Run Code Online (Sandbox Code Playgroud)

+----------------------------+
| JSONValues                 |
+============================+
| [{"myKey":1},{"myKey2":2}] |
+----------------------------+
| [{"myKey3":3}]             |
+----------------------------+
Run Code Online (Sandbox Code Playgroud)

查询结果

+--------+
| Result |
+========+
| myKey  |
+--------+
| myKey2 |
+--------+
| myKey3 |
+--------+
Run Code Online (Sandbox Code Playgroud)