Når du bruger SQL-serveren, 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 PATH
mulighed.
Syntaks
Syntaksen ser sådan ud:
SELECT ... (your query goes here) FOR JSON PATH;
Så dybest set, alt hvad du skal gøre er at tilføje FOR JSON PATH
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 PATH;
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, og jeg bruger en underforespørgsel til at hente albummene for hver kunstner.
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;
Resultat:
[ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ]
I dette tilfælde er hvert album blevet indlejret under "Albums". Dette skyldes, at albummene returneres via en underforespørgsel.
Eksempel 3 – Indlejret output med punktnotation
Når du bruger PATH
mulighed, kan du bruge punktseparerede kolonnenavne til at oprette indlejrede objekter.
For at gøre dette skal du bruge et punktsepareret alias. Her er et eksempel:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Resultat:
[ { "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" } } ]
Eksempel 4 – 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 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH, ROOT('Albums');
Resultat:
{ "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" } } ] }
Eksempel 5 – 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 PATH, 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.