In SQL Server kunt u de FOR JSON
. gebruiken 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 de AUTO
optie.
Syntaxis
De syntaxis gaat als volgt:
SELECT ... (your query goes here) FOR JSON AUTO;
Dus eigenlijk hoef je alleen maar FOR JSON AUTO
. 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 AUTO;
Resultaat:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Dus de resultaten komen eruit 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 sindsdien 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.
USE Music; SELECT ArtistName, AlbumName FROM Artists INNER JOIN Albums ON Artists.ArtistId = Albums.ArtistId ORDER BY ArtistName FOR JSON AUTO;
Resultaat:
[ { "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" } ] } ]
Zoals je kunt zien, is elk album genest onder "Albums". Dit komt omdat de AUTO
optie bepaalt de uitvoer op basis van de volgorde van kolommen in de SELECT
lijst en hun brontabellen.
Voorbeeld 3 – 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 ArtistName, AlbumName FROM Artists INNER JOIN Albums ON Artists.ArtistId = Albums.ArtistId ORDER BY ArtistName FOR JSON AUTO, ROOT('Music');
Resultaat:
{ "Music": [ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ] }
Ik heb de resultatenset ook beperkt tot slechts drie resultaten door TOP 3
toe te voegen op de vraag.
Voorbeeld 4 – 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 AUTO, 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.