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

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

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.