Als u SQL Server gebruikt, kunt u de FOR JSON
clausule in een query om de resultaten op te maken als JSON. Wanneer u dit doet, moet u kiezen voor de AUTO
of het PATH
optie. Dit artikel bevat voorbeelden van het gebruik van het PATH
optie.
Syntaxis
De syntaxis gaat als volgt:
SELECT ... (your query goes here) FOR JSON PATH;
Dus eigenlijk hoef je alleen maar FOR JSON PATH
toe te voegen aan het einde van uw zoekopdracht.
Voorbeeld 1 – Basisgebruik
Hier is een voorbeeld om te demonstreren.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON PATH;
Resultaat:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
De resultaten worden dus weergegeven als een mooi opgemaakt JSON-document, in plaats van in rijen en kolommen.
In dit geval gebruikte ik TOP 3
om de resultaatset te beperken tot slechts drie resultaten.
Resultaten uit één regel?
Uw resultaten kunnen aanvankelijk worden weergegeven in een enkele rij en een enkele kolom, en als een lange regel, zoals deze:
Als dit het geval is, probeer dan op de resultatenset te klikken. Afhankelijk van uw databasebeheersoftware zou dit het JSON-document moeten starten zoals het in het bovenstaande voorbeeld wordt weergegeven.
Of dit precies werkt zoals beschreven, hangt af van de software die u gebruikt om SQL Server te doorzoeken.
Op het moment van schrijven werkte dit prima voor mij bij het gebruik van SQL Operations Studio (dat inmiddels is hernoemd naar Azure Data Studio). Het werkte ook prima bij het gebruik van de MSSQL-extensie in VS Code. SSMS formatteert de resultaten echter alleen als één lange regel (hoewel nog steeds in JSON-indeling).
Ik had ook wisselend succes met het gebruik van opdrachtregelprogramma's.
Het kan ook zijn dat de resultaten aanvankelijk over meerdere rijen zijn verdeeld, afhankelijk van hoe groot de resultatenset is.
Als het je niet lukt om de resultaten op een bevredigende manier weer te geven, probeer dan een andere tool.
Voorbeeld 2 – Zoekopdracht over meerdere tabellen
In dit voorbeeld voer ik een query uit op twee tabellen die een een-op-veel-relatie hebben. In dit geval kan elke artiest veel albums hebben en ik gebruik een subquery om de albums voor elke artiest op te halen.
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;
Resultaat:
[ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ]
In dit geval is elk album genest onder "Albums". Dit komt omdat de albums worden geretourneerd via een subquery.
Voorbeeld 3 – Geneste uitvoer met puntnotatie
Bij gebruik van het PATH
optie, kunt u door punten gescheiden kolomnamen gebruiken om geneste objecten te maken.
Gebruik hiervoor een door punten gescheiden alias. Hier is een voorbeeld:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Resultaat:
[ { "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" } } ]
Voorbeeld 4 – Voeg een Root Node toe
U kunt de ROOT()
. gebruiken optie om een hoofdknooppunt aan de uitvoer toe te voegen. Dit voegt een enkel element op het hoogste niveau toe aan de uitvoer. Om dit te doen, voegt u eenvoudig de ROOT()
. toe optie aan het einde van de query, met de naam die u wilt dat het hoofdknooppunt heeft.
Dus we kunnen het vorige voorbeeld hieraan aanpassen:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH, ROOT('Albums');
Resultaat:
{ "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" } } ] }
Voorbeeld 5 – Verwijder de array-wrapper
U kunt de WITHOUT_ARRAY_WRAPPER
. gebruiken optie om de vierkante haken rond de resultaten te verwijderen.
Voorbeeld:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
Resultaat:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Houd er rekening mee dat als u dit doet op een resultaat met meerdere rijen, u een ongeldige JSON krijgt.