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)
从默认 OPENJSON schema 中选择 [key] 。
Run Code Online (Sandbox Code Playgroud)DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'; SELECT [key] FROM OPENJSON(@json_doc); GO| 关键| | :---- | | 姓名1 | | 姓名2 |
dbfiddle在这里
添加到这个答案。
获取列中的所有 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)
| 归档时间: |
|
| 查看次数: |
5621 次 |
| 最近记录: |