Při používání serveru 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í PATH
možnost.
Syntaxe
Syntaxe vypadá takto:
SELECT ... (your query goes here) FOR JSON PATH;
Takže v podstatě vše, co musíte udělat, je přidat FOR JSON PATH
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 PATH;
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 to pro mě fungovalo dobře při používání 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 a já používám dílčí dotaz k načtení alb pro každého interpreta.
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;
Výsledek:
[ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ]
V tomto případě bylo každé album vnořeno pod „Alba“. Je to proto, že alba jsou vrácena prostřednictvím dílčího dotazu.
Příklad 3 – Vnořený výstup s tečkovou notací
Při použití PATH
můžete použít názvy sloupců oddělené tečkami k vytvoření vnořených objektů.
Chcete-li to provést, použijte alias oddělený tečkami. Zde je příklad:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Výsledek:
[ { "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" } } ]
Příklad 4 – 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 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH, ROOT('Albums');
Výsledek:
{ "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" } } ] }
Příklad 5 – 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 PATH, 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.