在 SQL Server 中查询 json 键名

Eil*_*eth 8 sql-server json

鉴于这样的json...

{"setting1":"A","setting2":"B","setting3":"C"}
Run Code Online (Sandbox Code Playgroud)

我希望看到这样的结果......

+----------+-------+
|   name   | value |
+----------+-------+
| setting1 | A     |
| setting2 | B     |
| setting3 | C     |
+----------+-------+
Run Code Online (Sandbox Code Playgroud)

我的挣扎是我试图找出如何提取密钥的名称(即“setting1”、“setting2”、“setting3”等)

我可以执行类似以下查询的操作,但我不知道会有多少设置以及它们的名称是什么,所以我想要更动态的东西。

SELECT
    B.name,
    B.value
FROM OPENJSON(@json) WITH
    (
        setting1 varchar(50) '$.setting1',
        setting2 varchar(50) '$.setting2',
        setting3 varchar(50) '$.setting3'
    ) A
CROSS APPLY
    (
        VALUES
            ('setting1', A.setting1),
            ('setting2', A.setting2),
            ('setting3', A.setting3)
    ) B (name, value)
Run Code Online (Sandbox Code Playgroud)

使用 XML,我可以做一些简单的事情:

DECLARE @xml XML = '<settings><setting1>A</setting1><setting2>B</setting2><setting3>C</setting3></settings>'
SELECT
    A.setting.value('local-name(.)', 'VARCHAR(50)') name,
    A.setting.value('.', 'VARCHAR(50)') value
FROM @xml.nodes('settings/*') A (setting)
Run Code Online (Sandbox Code Playgroud)

有什么办法可以用 SQL Server 的 json 功能做类似的事情吗?

Jon*_*asr 11

Aaron Bertrand 在Advanced JSON Techniques 中撰写了有关 json 键值的文章

SELECT x.[Key], x.[Value] 
FROM OPENJSON(@Json, '$') AS x;
Run Code Online (Sandbox Code Playgroud)

返回

Key         Value
------------------
setting1    A
setting2    B
setting3    C
Run Code Online (Sandbox Code Playgroud)