Quando utilizzi SQL Server, puoi utilizzare 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 PATH
opzione.
Sintassi
La sintassi è questa:
SELECT ... (your query goes here) FOR JSON PATH;
Quindi, in pratica, tutto ciò che devi fare è aggiungere FOR JSON PATH
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 PATH;
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 usa 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 molti album e io uso una sottoquery per recuperare gli album per ogni artista.
USE Music; SELECT TOP 2 ArtistName, (SELECT AlbumName FROM Albums WHERE Artists.ArtistId = Albums.ArtistId FOR JSON PATH) AS Albums FROM Artists ORDER BY ArtistName FOR JSON PATH;
Risultato:
[ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ]
In questo caso, ogni album è stato nidificato in "Album". Questo perché gli album vengono restituiti tramite una sottoquery.
Esempio 3 – Output nidificato con notazione punto
Quando si utilizza il PATH
opzione, puoi utilizzare nomi di colonne separati da punti per creare oggetti nidificati.
Per fare ciò, usa un alias separato da punti. Ecco un esempio:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Risultato:
[ { "AlbumId": 1, "Details": { "Album Name": "Powerslave", "Release Date": "1984-09-03" } }, { "AlbumId": 2, "Details": { "Album Name": "Powerage", "Release Date": "1978-05-05" } }, { "AlbumId": 3, "Details": { "Album Name": "Singing Down the Lane", "Release Date": "1956-01-01" } } ]
Esempio 4: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 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH, ROOT('Albums');
Risultato:
{ "Albums": [ { "AlbumId": 1, "Details": { "Album Name": "Powerslave", "Release Date": "1984-09-03" } }, { "AlbumId": 2, "Details": { "Album Name": "Powerage", "Release Date": "1978-05-05" } }, { "AlbumId": 3, "Details": { "Album Name": "Singing Down the Lane", "Release Date": "1956-01-01" } } ] }
Esempio 5: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 PATH, 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.