次の方法で共有


SQL Database エンジンとクライアント アプリで FOR JSON 出力を使用する

適用対象:Sql Server 2016 (13.x) 以降のバージョンAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (サーバーレス SQL プールのみ)Microsoft Fabric プレビューの SQL データベース

次の例では、SQL Server またはクライアント アプリで FOR JSON 句とその JSON 出力を使用する方法をいくつか示します。 詳細については、「FOR JSON を使用してクエリ結果を JSON として書式設定する」を参照してください。

Fabric Data Warehouse では、 FOR JSON はクエリの最後の演算子である必要があるため、この記事の例のように、サブクエリ内では使用できません。

SQL Database エンジン変数で FOR JSON 出力を使用する

FOR JSON句の出力は nvarchar(max) 型であるため、次の例に示すように、任意の変数に代入できます。

DECLARE @x NVARCHAR(MAX) =
  (SELECT TOP 10 *
     FROM Sales.SalesOrderHeader
     FOR JSON AUTO)  

SQL Database エンジンのユーザー定義関数で FOR JSON 出力を使用する

結果セットを JSON として書式設定し、この JSON 出力を返すユーザー定義関数を作成することができます。 次の例では、いくつかの販売注文の詳細行を取得してそれを JSON 配列として書式設定するユーザー定義関数を作成しています。

CREATE FUNCTION GetSalesOrderDetails(@salesOrderId int)  
 RETURNS NVARCHAR(MAX)  
AS  
BEGIN  
   RETURN (SELECT UnitPrice, OrderQty  
           FROM Sales.SalesOrderDetail  
           WHERE SalesOrderID = @salesOrderId  
           FOR JSON AUTO)  
END

この関数は、次の例に示すように、バッチまたはクエリで使用することができます。

DECLARE @x NVARCHAR(MAX) = dbo.GetSalesOrderDetails(43659)

PRINT dbo.GetSalesOrderDetails(43659)

SELECT TOP 10
  H.*, dbo.GetSalesOrderDetails(H.SalesOrderId) AS Details
FROM Sales.SalesOrderHeader H

親と子のデータを 1 つのテーブルにマージする

次の例では、子の行の各セットは JSON 配列として書式設定されます。 JSON 配列は、親テーブルの Details 列の値になります。

SELECT TOP 10 SalesOrderId, OrderDate,  
      (SELECT TOP 3 UnitPrice, OrderQty  
         FROM Sales.SalesOrderDetail D  
         WHERE H.SalesOrderId = D.SalesOrderID  
         FOR JSON AUTO) AS Details  
INTO SalesOrder  
FROM Sales.SalesOrderHeader H  

JSON の列のデータを更新する

次の例に、JSON テキストを含む列の値を更新する方法を示します。

UPDATE SalesOrder  
SET Details =  
     (SELECT TOP 1 UnitPrice, OrderQty  
       FROM Sales.SalesOrderDetail D  
       WHERE D.SalesOrderId = SalesOrder.SalesOrderId  
      FOR JSON AUTO) 

C# クライアント アプリで FOR JSON 出力を使用する

次の例に、クエリの JSON の出力を C# クライアント アプリの StringBuilder オブジェクトに取得する方法を示します。 変数queryWithForJsonに、SELECT句を含むFOR JSON ステートメントのテキストが含まれているとします。

var queryWithForJson = "SELECT ... FOR JSON";
using(var conn = new SqlConnection("<connection string>"))
{
    using(var cmd = new SqlCommand(queryWithForJson, conn))
    {
        conn.Open();
        var jsonResult = new StringBuilder();
        var reader = cmd.ExecuteReader();
        if (!reader.HasRows)
        {
            jsonResult.Append("[]");
        }
        else
        {
            while (reader.Read())
            {
                jsonResult.Append(reader.GetValue(0).ToString());
            }
        }
    }
}

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

組み込みの JSON サポートの視覚的な概要については、次のビデオを参照してください。