W SQL Server możesz użyć FOR JSON
klauzula w zapytaniu, aby sformatować wyniki jako JSON. Robiąc to, musisz wybrać opcję AUTO
lub PATH
opcja. Ten artykuł zawiera przykłady użycia AUTO
opcja.
Składnia
Składnia wygląda tak:
SELECT ... (your query goes here) FOR JSON AUTO;
Więc w zasadzie wszystko, co musisz zrobić, to dodać FOR JSON AUTO
do końca zapytania.
Przykład 1 – Podstawowe użycie
Oto przykład do zademonstrowania.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO;
Wynik:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Wyniki są więc wyświetlane jako ładnie sformatowany dokument JSON, a nie w wierszach i kolumnach.
W tym przypadku użyłem TOP 3
aby ograniczyć zestaw wyników do zaledwie trzech wyników.
Wyniki pojedynczej linii?
Twoje wyniki mogą początkowo pojawiać się w jednym wierszu i jednej kolumnie, a także jako jedna długa linia:
W takim przypadku spróbuj kliknąć zestaw wyników. W zależności od oprogramowania do zarządzania bazą danych, powinno to uruchomić dokument JSON, jak widać w powyższym przykładzie.
To, czy działa to dokładnie tak, jak opisano, zależy od oprogramowania używanego do wysyłania zapytań do serwera SQL.
W momencie pisania tego tekstu działało to dobrze podczas korzystania z programu SQL Operations Studio (którego nazwa została zmieniona na Azure Data Studio). Działało również dobrze podczas korzystania z rozszerzenia MSSQL w VS Code. Jednak SSMS formatuje wyniki tylko jako jedną długą linię (chociaż nadal w formacie JSON).
Miałem też różne stopnie sukcesu przy użyciu narzędzi wiersza poleceń.
Może się również okazać, że wyniki są początkowo rozłożone w wielu wierszach, w zależności od tego, jak duży jest zestaw wyników.
Jeśli nie możesz zmusić go do wyświetlania wyników w zadowalający sposób, wypróbuj inne narzędzie.
Przykład 2 – Zapytanie w wielu tabelach
W tym przykładzie wysyłam zapytanie do dwóch tabel, które mają między sobą relację jeden-do-wielu. W takim przypadku każdy wykonawca może mieć wiele albumów.
USE Music; SELECT ArtistName, AlbumName FROM Artists INNER JOIN Albums ON Artists.ArtistId = Albums.ArtistId ORDER BY ArtistName FOR JSON AUTO;
Wynik:
[ { "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" } ] } ]
Jak widać, każdy album został zagnieżdżony w „Albumach”. Dzieje się tak, ponieważ AUTO
opcja określa dane wyjściowe na podstawie kolejności kolumn w SELECT
lista i ich tabele źródłowe.
Przykład 3 – Dodaj węzeł główny
Możesz użyć ROOT()
możliwość dodania węzła głównego do danych wyjściowych. Powoduje to dodanie do danych wyjściowych pojedynczego elementu najwyższego poziomu. Aby to zrobić, po prostu dodaj ROOT()
na końcu zapytania, podając nazwę, którą ma mieć węzeł główny.
Więc możemy zmodyfikować poprzedni przykład do tego:
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');
Wynik:
{ "Music": [ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ] }
Ograniczyłem również zestaw wyników do zaledwie trzech wyników, dodając TOP 3
do zapytania.
Przykład 4 – Usuń opakowanie tablicy
Możesz użyć WITHOUT_ARRAY_WRAPPER
opcja usunięcia nawiasów kwadratowych otaczających wyniki.
Przykład:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
Wynik:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Pamiętaj, że jeśli zrobisz to w wyniku wielu wierszy, otrzymasz nieprawidłowy kod JSON.