T-Sql

SQL Server 2016 可以從 JSON 中提取節點名稱嗎?

  • February 11, 2021

我想從 SQL Server 2016 中儲存為 nvarchar 值的任意格式良好的 JSON 文件中提取節點名稱及其路徑的完整列表。有沒有可靠的方法來做到這一點?

例如,對於 json 值:

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

在查詢 @json_doc 時得到這個結果:

NODE_NAME
$.Name1
$.Name2

選擇

$$ key $$從預設的 OPENJSON 架構

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

例如,

+------------------+
| JSONValues       |
+==================+
| {"myKey":1}      |
+------------------+
| {"myOtherKey":1} |
+------------------+

查詢結果

+------------+
| Result     |
+============+
| myKey      |
+------------+
| myOtherKey |
+------------+

獲取所有 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

+----------------------------+
| JSONValues                 |
+============================+
| [{"myKey":1},{"myKey2":2}] |
+----------------------------+
| [{"myKey3":3}]             |
+----------------------------+

查詢結果

+--------+
| Result |
+========+
| myKey  |
+--------+
| myKey2 |
+--------+
| myKey3 |
+--------+

引用自:https://dba.stackexchange.com/questions/168303