共用方式為


在 SQL Database 引擎和用戶端應用程式中使用 FOR JSON 輸出

適用於:SQL Server 2016 (13.x) 及以後版本 Azure SQL Database AzureSQL Managed InstanceAzure Synapse Analytics (僅限 serverless SQL pool )SQL database in Microsoft Fabric

下列範例示範在 SQL Server 或用戶端應用程式中使用 FOR JSON 子句及其 JSON 輸出的一些方式。 如需詳細資訊,請參閱使用 FOR JSON 將查詢結果格式化為 JSON

在網狀架構數據倉儲中,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 Engine 使用者定義函式中使用 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

將父資料和子資料合併至單一資料表中

在下列範例中,每組子資料列會格式化為 JSON 陣列。 JSON 陣列便成為父資料表中的 [詳細資料] 資料行的值。

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 Database Engine 中的 JSON

如需內建 JSON 支援的視覺效果簡介,請參閱下列影片: