I SQL Server kan du bruge FOR JSON
klausul i en forespørgsel for at formatere resultaterne som JSON. Når du gør dette, skal du vælge enten AUTO
eller PATH
mulighed. Denne artikel indeholder eksempler på brug af AUTO
mulighed.
Syntaks
Syntaksen ser sådan ud:
SELECT ... (your query goes here) FOR JSON AUTO;
Så dybest set, alt hvad du skal gøre er at tilføje FOR JSON AUTO
til slutningen af din forespørgsel.
Eksempel 1 – Grundlæggende brug
Her er et eksempel til at demonstrere.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO;
Resultat:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Så resultaterne kommer ud som et pænt formateret JSON-dokument i stedet for i rækker og kolonner.
I dette tilfælde brugte jeg TOP 3
for at begrænse resultatsættet til kun tre resultater.
Enkelt linje resultater?
Dine resultater kan til at begynde med vises i en enkelt række og en enkelt kolonne og som en lang linje som denne:
Hvis dette er tilfældet, prøv at klikke på resultatsættet. Afhængigt af din databasestyringssoftware bør dette starte JSON-dokumentet, som det vises i ovenstående eksempel.
Om dette fungerer nøjagtigt som beskrevet, afhænger af den software, du bruger til at forespørge efter SQL Server.
I skrivende stund fungerede dette fint for mig, når jeg brugte SQL Operations Studio (som siden er blevet omdøbt til Azure Data Studio). Det fungerede også fint, når du brugte MSSQL-udvidelsen i VS Code. SSMS formaterer dog kun resultaterne som én lang linje (dog stadig i JSON-format).
Jeg havde også forskellige grader af succes med at bruge kommandolinjeværktøjer.
Du kan også opleve, at resultaterne i starten er fordelt på flere rækker, afhængigt af hvor stort resultatsættet er.
Hvis du ikke kan få det til at vise resultaterne på en tilfredsstillende måde, så prøv et andet værktøj.
Eksempel 2 – Forespørgsel på tværs af flere tabeller
I dette eksempel forespørger jeg to tabeller, der har en en-til-mange-relation mellem dem. I dette tilfælde kan hver kunstner have mange album.
USE Music; SELECT ArtistName, AlbumName FROM Artists INNER JOIN Albums ON Artists.ArtistId = Albums.ArtistId ORDER BY ArtistName FOR JSON AUTO;
Resultat:
[ { "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" } ] } ]
Som du kan se, er hvert album blevet indlejret under "Albums". Dette skyldes, at AUTO
option bestemmer output baseret på rækkefølgen af kolonner i SELECT
liste og deres kildetabeller.
Eksempel 3 – Tilføj en rodnode
Du kan bruge ROOT()
mulighed for at tilføje en rodnode til outputtet. Dette tilføjer et enkelt element på øverste niveau til outputtet. For at gøre dette skal du blot tilføje ROOT()
mulighed til slutningen af forespørgslen med det navn, du ønsker, at rodknuden skal have.
Så vi kan ændre det foregående eksempel til dette:
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');
Resultat:
{ "Music": [ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ] }
Jeg begrænsede også resultatsættet til kun tre resultater ved at tilføje TOP 3
til forespørgslen.
Eksempel 4 – Fjern Array Wrapper
Du kan bruge WITHOUT_ARRAY_WRAPPER
mulighed for at fjerne de firkantede parenteser, der omgiver resultaterne.
Eksempel:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
Resultat:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Bemærk, at hvis du gør dette på et resultat med flere rækker, ender du med ugyldig JSON.