Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Esempi di SQL Server FOR JSON AUTO (T-SQL)

In SQL Server puoi usare FOR JSON clausola in una query per formattare i risultati come JSON. Quando esegui questa operazione, devi scegliere il AUTO o il PATH opzione. Questo articolo contiene esempi di utilizzo di AUTO opzione.

Sintassi

La sintassi è questa:

SELECT ...
  (your query goes here)
FOR JSON AUTO;

Quindi, in pratica, tutto ciò che devi fare è aggiungere FOR JSON AUTO alla fine della tua richiesta.

Esempio 1 – Utilizzo di base

Ecco un esempio da dimostrare.

USE Music;
SELECT TOP 3 AlbumName, ReleaseDate
FROM Albums
FOR JSON AUTO;

Risultato:

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

Quindi i risultati escono come un documento JSON ben formattato, invece che in righe e colonne.

In questo caso ho usato TOP 3 per limitare il set di risultati a soli tre risultati.

Risultati a riga singola?

I tuoi risultati potrebbero inizialmente essere visualizzati in una singola riga e in una singola colonna e come una lunga riga come questa:

In questo caso, prova a fare clic sul set di risultati. A seconda del software di gestione del database, questo dovrebbe avviare il documento JSON come appare nell'esempio sopra.

Se funziona esattamente come descritto dipenderà dal software utilizzato per interrogare SQL Server.

Al momento della scrittura, questo ha funzionato bene per me quando si utilizza SQL Operations Studio (che da allora è stato rinominato in Azure Data Studio). Funzionava bene anche quando si utilizzava l'estensione MSSQL in VS Code. SSMS, tuttavia, formatta i risultati solo come una riga lunga (sebbene ancora in formato JSON).

Ho anche avuto vari gradi di successo utilizzando gli strumenti della riga di comando.

Potresti anche scoprire che i risultati sono inizialmente distribuiti su più righe, a seconda di quanto è grande il set di risultati.

Se non riesci a visualizzare i risultati in modo soddisfacente, prova uno strumento diverso.

Esempio 2:query su più tabelle

In questo esempio, interrogo due tabelle che hanno una relazione uno-a-molti tra loro. In questo caso, ogni artista può avere più album.

USE Music;
SELECT 
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO;

Risultato:

[
    {
        "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"
            }
        ]
    }
]

Come puoi vedere, ogni album è stato nidificato in "Album". Questo perché AUTO L'opzione determina l'output in base all'ordine delle colonne nel SELECT list e le relative tabelle di origine.

Esempio 3:aggiungere un nodo radice

Puoi usare il ROOT() opzione per aggiungere un nodo radice all'output. Questo aggiunge un singolo elemento di primo livello all'output. Per fare ciò, aggiungi semplicemente il ROOT() opzione alla fine della query, con il nome che vuoi che il nodo radice abbia.

Quindi possiamo modificare l'esempio precedente in questo:

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');

Risultato:

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

Ho anche limitato il set di risultati a soli tre risultati aggiungendo TOP 3 alla domanda.

Esempio 4:rimozione dell'involucro dell'array

Puoi usare il WITHOUT_ARRAY_WRAPPER opzione per rimuovere le parentesi quadre che racchiudono i risultati.

Esempio:

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

Risultato:

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

Tieni presente che se lo fai su un risultato a più righe, ti ritroverai con un JSON non valido.