В SQL Server можете да използвате FOR JSON
клауза в заявка за форматиране на резултатите като JSON. Когато правите това, трябва да изберете или AUTO
или PATH
опция. Тази статия съдържа примери за използване на AUTO
опция.
Синтаксис
Синтаксисът е така:
SELECT ... (your query goes here) FOR JSON AUTO;
Така че по принцип всичко, което трябва да направите, е да добавите FOR JSON AUTO
до края на вашата заявка.
Пример 1 – Основна употреба
Ето пример за демонстрация.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO;
Резултат:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Така резултатите излизат като добре форматиран JSON документ, вместо в редове и колони.
В този случай използвах TOP 3
за да ограничите набора от резултати до само три резултата.
Резултати от един ред?
Резултатите ви може първоначално да се показват в един ред и една колона и като един дълъг ред като този:
Ако случаят е такъв, опитайте да щракнете върху набора от резултати. В зависимост от вашия софтуер за управление на база данни, това трябва да стартира JSON документа, както е показано в горния пример.
Дали това работи точно както е описано ще зависи от софтуера, който използвате за запитване на SQL Server.
Към момента на писане това работеше добре за мен, когато използвах SQL Operations Studio (което оттогава беше преименувано на Azure Data Studio). Също така работи добре при използване на разширението MSSQL в VS Code. SSMS обаче форматира резултатите само като един дълъг ред (въпреки че все още във формат JSON).
Освен това имах различна степен на успех с помощта на инструменти на командния ред.
Може също така да откриете, че резултатите първоначално са разпределени в няколко реда в зависимост от това колко голям е наборът от резултати.
Ако не можете да го накарате да показва резултатите по задоволителен начин, опитайте друг инструмент.
Пример 2 – Заявка в множество таблици
В този пример правя заявка за две таблици, които имат връзка едно към много между тях. В този случай всеки изпълнител може да има много албуми.
USE Music; SELECT ArtistName, AlbumName FROM Artists INNER JOIN Albums ON Artists.ArtistId = Albums.ArtistId ORDER BY ArtistName FOR JSON AUTO;
Резултат:
[ { "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" } ] } ]
Както можете да видите, всеки албум е вложен под „Албуми“. Това е така, защото AUTO
опцията определя изхода въз основа на реда на колоните в SELECT
списък и техните изходни таблици.
Пример 3 – Добавяне на коренен възел
Можете да използвате ROOT()
опция за добавяне на главен възел към изхода. Това добавя един единствен елемент от най-високо ниво към изхода. За да направите това, просто добавете ROOT()
опция до края на заявката с името, което искате да има основният възел.
Така че можем да модифицираме предишния пример към това:
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');
Резултат:
{ "Music": [ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ] }
Освен това ограничих набора от резултати до само три резултата, като добавих TOP 3
към заявката.
Пример 4 – Премахване на обвивката на масива
Можете да използвате WITHOUT_ARRAY_WRAPPER
опция за премахване на квадратните скоби, които обграждат резултатите.
Пример:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
Резултат:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Имайте предвид, че ако направите това с резултат от няколко реда, ще получите невалиден JSON.