V SQL Server můžete použít FOR JSON
klauzule v dotazu pro formátování výsledků jako JSON. Při tom musíte vybrat buď AUTO
nebo PATH
volba. Tento článek obsahuje příklady použití AUTO
možnost.
Syntaxe
Syntaxe vypadá takto:
SELECT ... (your query goes here) FOR JSON AUTO;
Takže v podstatě vše, co musíte udělat, je přidat FOR JSON AUTO
na konec vašeho dotazu.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO;
Výsledek:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Výsledky tedy vyjdou jako pěkně naformátovaný dokument JSON, nikoli v řádcích a sloupcích.
V tomto případě jsem použil TOP 3
omezit sadu výsledků na pouhé tři výsledky.
Výsledky s jedním řádkem?
Vaše výsledky se mohou zpočátku zobrazit v jednom řádku a jediném sloupci a jako jeden dlouhý řádek, jako je tento:
V takovém případě zkuste kliknout na sadu výsledků. V závislosti na vašem softwaru pro správu databází by to mělo spustit dokument JSON, jak je uvedeno ve výše uvedeném příkladu.
Zda to funguje přesně tak, jak je popsáno, bude záviset na softwaru, který používáte k dotazování na SQL Server.
V době psaní tohoto článku mi to fungovalo dobře, když jsem používal SQL Operations Studio (které bylo mezitím přejmenováno na Azure Data Studio). Fungovalo to také dobře při použití rozšíření MSSQL ve VS Code. SSMS však pouze formátuje výsledky jako jeden dlouhý řádek (i když stále ve formátu JSON).
Také jsem měl různé stupně úspěchu pomocí nástrojů příkazového řádku.
Můžete také zjistit, že výsledky jsou zpočátku rozděleny do více řádků v závislosti na tom, jak velká je sada výsledků.
Pokud nemůžete dosáhnout toho, aby zobrazoval výsledky uspokojivým způsobem, zkuste jiný nástroj.
Příklad 2 – Dotaz ve více tabulkách
V tomto příkladu dotazuji dvě tabulky, které mají mezi sebou vztah jedna k mnoha. V tomto případě může mít každý interpret mnoho alb.
USE Music; SELECT ArtistName, AlbumName FROM Artists INNER JOIN Albums ON Artists.ArtistId = Albums.ArtistId ORDER BY ArtistName FOR JSON AUTO;
Výsledek:
[ { "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 můžete vidět, každé album bylo vnořeno pod „Alba“. Je to proto, že AUTO
volba určuje výstup na základě pořadí sloupců v SELECT
seznam a jejich zdrojové tabulky.
Příklad 3 – Přidání kořenového uzlu
Můžete použít ROOT()
možnost přidat kořenový uzel do výstupu. Tím se do výstupu přidá jeden prvek nejvyšší úrovně. Chcete-li to provést, jednoduše přidejte ROOT()
možnost na konec dotazu s názvem, který chcete, aby měl kořenový uzel.
Takže můžeme upravit předchozí příklad na tento:
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');
Výsledek:
{ "Music": [ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ] }
Také jsem omezil sadu výsledků na pouhé tři výsledky přidáním TOP 3
na dotaz.
Příklad 4 – Odstraňte obal pole
Můžete použít WITHOUT_ARRAY_WRAPPER
možnost odstranit hranaté závorky, které obklopují výsledky.
Příklad:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
Výsledek:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Pamatujte, že pokud to uděláte u výsledku s více řádky, skončíte s neplatným JSON.