sql >> データベース >  >> RDS >> Sqlserver

JSON AUTOの例のSQLServer(T-SQL)

    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が発生することに注意してください。


    1. MySQLのmy.cnfの場所を見つけるにはどうすればよいですか

    2. アプリケーションの新しいバージョンを更新するときにsqliteデータベースを削除します

    3. OracleODP.NetおよびEFCodeFirstと連携するようにDbContextを構成するにはどうすればよいですか。

    4. SQLServerでのDateTime2とDateTime