Desejo extrair uma lista completa dos nomes dos nós e seus caminhos de qualquer documento JSON arbitrário e bem formado armazenado como valor nvarchar no SQL Server 2016. Existe uma maneira confiável de fazer isso?
Por exemplo, para um valor json:
DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'
Obtenha este resultado ao consultar @json_doc:
NODE_NAME
$.Name1
$.Name2
Selecione [chave] do esquema OPENJSON padrão .
dbfiddle aqui
Para adicionar a esta resposta.
Obtenha todas as chaves JSON em uma coluna:
Por exemplo, Tabela :
Resultado da consulta :
Obtenha todas as chaves JSON em que JSON é uma matriz de objetos:
Tabela :
Resultado da consulta :
Usando CTE recursivo para mostrar tudo. Tipo 4 e 5 (resultados da função OPENJSON) são arrays e sub_json respectivamente. Outros tipos são valores atômicos. A consulta retorna caminho completo, valor, chave e tipo de cada elemento na variável json.
Na pergunta original retornará:
Se você usar números como chaves como: SET @json_doc ='{"1":"Value1", "2":"Value2"}'; Os resultados estarão errados:
O problema aqui é que eu uso IIF(TRY_CAST([Key] AS int) para identificar o índice do array e nenhum item nomeado. Alguns truques podem ser feitos para evitar isso, mas eu não queria complicar demais essa coisa. (E usando números como nomes de chave é uma má idéia na minha opinião. Em um exemplo um pouco mais complicado (de http://www.json.org/example.html )
resultados (omitindo o valor por uma questão de clareza):