När du använder SQL Server kan du använda FOR JSON
klausul i en fråga för att formatera resultaten som JSON. När du gör detta måste du välja antingen AUTO
eller PATH
alternativ. Den här artikeln innehåller exempel på hur du använder PATH
alternativ.
Syntax
Syntaxen ser ut så här:
SELECT ... (your query goes here) FOR JSON PATH;
Så i princip, allt du behöver göra är att lägga till FOR JSON PATH
till slutet av din fråga.
Exempel 1 – Grundläggande användning
Här är ett exempel att visa.
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å resultaten kommer ut som ett snyggt formaterat JSON-dokument, istället för i rader och kolumner.
I det här fallet använde jag TOP 3
för att begränsa resultatuppsättningen till bara tre resultat.
Resultat från en rad?
Dina resultat kan initialt visas i en enda rad och en enda kolumn, och som en lång rad så här:
Om så är fallet, försök att klicka på resultatuppsättningen. Beroende på din databashanteringsprogramvara bör detta starta JSON-dokumentet som det visas i exemplet ovan.
Huruvida detta fungerar exakt som beskrivet beror på vilken programvara du använder för att fråga efter SQL Server.
I skrivande stund fungerade detta bra för mig när jag använde SQL Operations Studio (som sedan dess har döpts om till Azure Data Studio). Det fungerade också bra när du använde MSSQL-tillägget i VS Code. SSMS formaterar dock bara resultaten som en lång rad (men fortfarande i JSON-format).
Jag hade också olika grader av framgång med hjälp av kommandoradsverktyg.
Du kan också upptäcka att resultaten initialt fördelas över flera rader, beroende på hur stor resultatuppsättningen är.
Om du inte kan få det att visa resultaten på ett tillfredsställande sätt, prova ett annat verktyg.
Exempel 2 – Fråga över flera tabeller
I det här exemplet frågar jag två tabeller som har en en-till-många-relation mellan dem. I det här fallet kan varje artist ha många album, och jag använder en underfråga för att hämta albumen för varje artist.
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 det här fallet har varje album kapslats under "Album". Detta beror på att albumen returneras via en underfråga.
Exempel 3 – Kapslad utdata med punktnotering
När du använder PATH
alternativet kan du använda punktseparerade kolumnnamn för att skapa kapslade objekt.
För att göra detta, använd ett punktseparerat alias. Här är ett exempel:
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" } } ]
Exempel 4 – Lägg till en rotnod
Du kan använda ROOT()
alternativet för att lägga till en rotnod till utgången. Detta lägger till ett enda element på toppnivå till utdata. För att göra detta, lägg helt enkelt till ROOT()
alternativet till slutet av frågan, med det namn du vill att rotnoden ska ha.
Så vi kan modifiera det föregående exemplet till detta:
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" } } ] }
Exempel 5 – Ta bort Array Wrapper
Du kan använda WITHOUT_ARRAY_WRAPPER
alternativet för att ta bort hakparenteserna som omger resultaten.
Exempel:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
Resultat:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Observera att om du gör detta på ett resultat med flera rader kommer du att få ogiltig JSON.