Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Exemplos do SQL Server FOR JSON AUTO (T-SQL)


No SQL Server você pode usar o FOR JSON cláusula em uma consulta para formatar os resultados como JSON. Ao fazer isso, você deve escolher a opção AUTO ou o PATH opção. Este artigo contém exemplos de uso do AUTO opção.


Sintaxe


A sintaxe fica assim:
SELECT ...
  (your query goes here)
FOR JSON AUTO;

Então, basicamente, tudo que você precisa fazer é adicionar FOR JSON AUTO ao final de sua consulta.

Exemplo 1 – Uso básico


Aqui está um exemplo para demonstrar.
USE Music;
SELECT TOP 3 AlbumName, ReleaseDate
FROM Albums
FOR JSON AUTO;

Resultado:
[
    {
        "AlbumName": "Powerslave",
        "ReleaseDate": "1984-09-03"
    },
    {
        "AlbumName": "Powerage",
        "ReleaseDate": "1978-05-05"
    },
    {
        "AlbumName": "Singing Down the Lane",
        "ReleaseDate": "1956-01-01"
    }
]

Assim, os resultados saem como um documento JSON bem formatado, em vez de linhas e colunas.

Neste caso eu usei TOP 3 para limitar o conjunto de resultados a apenas três resultados.

Resultados de linha única?


Seus resultados podem aparecer inicialmente em uma única linha e uma única coluna, e como uma longa linha como esta:



Se este for o caso, tente clicar no conjunto de resultados. Dependendo do seu software de gerenciamento de banco de dados, isso deve iniciar o documento JSON conforme aparece no exemplo acima.

Se isso funcionará exatamente como descrito, dependerá do software que você usa para consultar o SQL Server.

No momento em que escrevo, isso funcionou bem para mim ao usar o SQL Operations Studio (que desde então foi renomeado para Azure Data Studio). Também funcionou bem ao usar a extensão MSSQL no VS Code. No entanto, o SSMS apenas formata os resultados como uma linha longa (embora ainda no formato JSON).

Eu também tive vários graus de sucesso usando ferramentas de linha de comando.

Você também pode descobrir que os resultados são inicialmente distribuídos em várias linhas, dependendo do tamanho do conjunto de resultados.

Se você não conseguir exibir os resultados de maneira satisfatória, tente uma ferramenta diferente.

Exemplo 2 – Consulta em várias tabelas


Neste exemplo, consulto duas tabelas que têm um relacionamento um-para-muitos entre elas. Neste caso, cada artista pode ter vários álbuns.
USE Music;
SELECT 
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO;

Resultado:
[
    {
        "ArtistName": "AC/DC",
        "Albums": [
            {
                "AlbumName": "Powerage"
            }
        ]
    },
    {
        "ArtistName": "Allan Holdsworth",
        "Albums": [
            {
                "AlbumName": "All Night Wrong"
            },
            {
                "AlbumName": "The Sixteen Men of Tain"
            }
        ]
    },
    {
        "ArtistName": "Buddy Rich",
        "Albums": [
            {
                "AlbumName": "Big Swing Face"
            }
        ]
    },
    {
        "ArtistName": "Devin Townsend",
        "Albums": [
            {
                "AlbumName": "Ziltoid the Omniscient"
            },
            {
                "AlbumName": "Casualties of Cool"
            },
            {
                "AlbumName": "Epicloud"
            }
        ]
    },
    {
        "ArtistName": "Iron Maiden",
        "Albums": [
            {
                "AlbumName": "Powerslave"
            },
            {
                "AlbumName": "Somewhere in Time"
            },
            {
                "AlbumName": "Piece of Mind"
            },
            {
                "AlbumName": "Killers"
            },
            {
                "AlbumName": "No Prayer for the Dying"
            }
        ]
    },
    {
        "ArtistName": "Jim Reeves",
        "Albums": [
            {
                "AlbumName": "Singing Down the Lane"
            }
        ]
    },
    {
        "ArtistName": "Michael Learns to Rock",
        "Albums": [
            {
                "AlbumName": "Blue Night"
            },
            {
                "AlbumName": "Eternity"
            },
            {
                "AlbumName": "Scandinavia"
            }
        ]
    },
    {
        "ArtistName": "The Script",
        "Albums": [
            {
                "AlbumName": "No Sound Without Silence"
            }
        ]
    },
    {
        "ArtistName": "Tom Jones",
        "Albums": [
            {
                "AlbumName": "Long Lost Suitcase"
            },
            {
                "AlbumName": "Praise and Blame"
            },
            {
                "AlbumName": "Along Came Jones"
            }
        ]
    }
]

Como você pode ver, cada álbum foi aninhado em “Álbuns”. Isso ocorre porque o AUTO A opção determina a saída com base na ordem das colunas no SELECT list e suas tabelas de origem.

Exemplo 3 – Adicionar um nó raiz


Você pode usar o ROOT() opção para adicionar um nó raiz à saída. Isso adiciona um único elemento de nível superior à saída. Para fazer isso, basta adicionar o ROOT() opção ao final da consulta, com o nome que você deseja que o nó raiz tenha.

Assim, podemos modificar o exemplo anterior para isso:
USE Music;
SELECT TOP 3
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO, ROOT('Music');

Resultado:
{
    "Music": [
        {
            "ArtistName": "AC/DC",
            "Albums": [
                {
                    "AlbumName": "Powerage"
                }
            ]
        },
        {
            "ArtistName": "Allan Holdsworth",
            "Albums": [
                {
                    "AlbumName": "All Night Wrong"
                },
                {
                    "AlbumName": "The Sixteen Men of Tain"
                }
            ]
        }
    ]
}

Também limitei o conjunto de resultados a apenas três resultados adicionando TOP 3 à consulta.

Exemplo 4 – Remova o wrapper de matriz


Você pode usar o WITHOUT_ARRAY_WRAPPER opção para remover os colchetes que cercam os resultados.

Exemplo:
USE Music;
SELECT TOP 1 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;

Resultado:
{
    "AlbumName": "Powerslave",
    "ReleaseDate": "1984-09-03"
}

Observe que, se você fizer isso em um resultado de várias linhas, acabará com um JSON inválido.