PATH モードで入れ子になった JSON 出力を書式設定する

適用対象:Sql Server 2016 (13.x) 以降のバージョンAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (サーバーレス SQL プールのみ )、Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のハードウェアSQL データベース

FOR JSON句の出力を完全に制御するには、PATH オプションを指定します。

PATH モードでは、ラッパー オブジェクトを作成し、複雑なプロパティを入れ子にすることができます。 結果は JSON オブジェクトの配列として書式設定されます。

別の方法として、 AUTO オプションを使用して、 SELECT ステートメントの構造に基づいて出力を自動的に書式設定することもできます。

次の例では、FOR JSON オプションで PATH 句を使用する方法を示します。 例に示すように、ドット区切りの列名を使用するか、ネストされたクエリを使用して、結果をネスト形式で書式化します。 既定では、null 値は出力 FOR JSON 含まれません。

Visual Studio Code 用の MSSQL 拡張機能では、書式設定されていない文字列を表示する代わりに、JSON の結果を自動的に書式設定できます (この記事を参照)。

例示

この記事のコードサンプルは、Azure Data SQL Samples Repository GitHub repositoryからダウンロードできるAdventureWorks2025またはAdventureWorksDW2025サンプルデータベースを使用しています。

A. ドット区切りの列名

次のクエリは、AdventureWorks Person テーブルの最初の 5 行を JSON として書式設定します。

FOR JSON PATH句では、列の別名または列名を使用して、JSON 出力のキー名を決定します。 エイリアスにドットが含まれている場合、 PATH オプションは入れ子になったオブジェクトを作成します。

SELECT TOP 5 BusinessEntityID AS Id,
             FirstName,
             LastName,
             Title AS 'Info.Title',
             MiddleName AS 'Info.MiddleName'
FROM Person.Person
FOR JSON PATH;

結果セットは次のとおりです。

[{
    "Id": 1,
    "FirstName": "Ken",
    "LastName": "Sanchez",
    "Info": {
        "MiddleName": "J"
    }
}, {
    "Id": 2,
    "FirstName": "Terri",
    "LastName": "Duffy",
    "Info": {
        "MiddleName": "Lee"
    }
}, {
    "Id": 3,
    "FirstName": "Roberto",
    "LastName": "Tamburello"
}, {
    "Id": 4,
    "FirstName": "Rob",
    "LastName": "Walters"
}, {
    "Id": 5,
    "FirstName": "Gail",
    "LastName": "Erickson",
    "Info": {
        "Title": "Ms.",
        "MiddleName": "A"
    }
}]

B: 複数のテーブル

クエリで複数のテーブルを参照すると、FOR JSON PATH でその別名を使用して各列が入れ子にされます。 次のクエリでは、クエリが結合する (OrderHeader, OrderDetails) ペアごとに 1 つの JSON オブジェクトが作成されます。

SELECT TOP 2 H.SalesOrderNumber AS 'Order.Number',
             H.OrderDate AS 'Order.Date',
             D.UnitPrice AS 'Product.Price',
             D.OrderQty AS 'Product.Quantity'
FROM Sales.SalesOrderHeader AS H
     INNER JOIN Sales.SalesOrderDetail AS D
         ON H.SalesOrderID = D.SalesOrderID
FOR JSON PATH;

結果セットは次のとおりです。

[{
    "Order": {
        "Number": "SO43659",
        "Date": "2011-05-31T00:00:00"
    },
    "Product": {
        "Price": 2024.9940,
        "Quantity": 1
    }
}, {
    "Order": {
        "Number": "SO43659"
    },
    "Product": {
        "Price": 2024.9940
    }
}]

SQL データベース エンジンでの JSON の詳細

組み込みの JSON サポートの視覚的な概要については、 NoSQL とリレーショナルワールドの間のブリッジとしての JSON を参照してください。