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
を使用しました 結果セットを3つの結果に制限します。
単一行の結果?
結果は、最初は1つの行と1つの列に表示され、次のような1つの長い行として表示される場合があります。
この場合は、結果セットをクリックしてみてください。データベース管理ソフトウェアによっては、上記の例のようにJSONドキュメントが起動するはずです。
これが説明どおりに機能するかどうかは、SQLServerのクエリに使用するソフトウェアによって異なります。
執筆時点では、SQL Operations Studio(その後Azure Data Studioに名前が変更されました)を使用している場合、これは問題なく機能しました。 VSCodeでMSSQL拡張機能を使用する場合にも正常に機能しました。ただし、SSMSは、結果を1つの長い行としてのみフォーマットします(ただし、JSON形式のままです)。
また、コマンドラインツールを使用してさまざまな程度の成功を収めました。
また、結果セットの大きさによっては、結果が最初は複数の行に分散されている場合もあります。
満足のいく方法で結果を表示できない場合は、別のツールを試してください。
例2–複数のテーブルにまたがるクエリ
この例では、1対多の関係にある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
を追加して、結果セットを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が発生することに注意してください。