共用方式為


在 SQL Server 和用戶端應用程式中使用 FOR JSON 輸出

適用於: SQL Server 2016 (13.x) 以上版本 Azure SQL 資料庫Azure SQL 受控執行個體Azure Synapse Analytics (僅無伺服器 SQL 集區)

下列範例示範在 SQL Server 或用戶端應用程式中使用 FOR JSON 子句及其 JSON 輸出的一些方式。 使用 FOR JSON 將查詢結果格式化為 JSON

在網狀架構數據倉儲中,FOR JSON 必須是查詢中的最後一個運算符,因此不允許在子查詢內,如本文中的範例所示。

在 SQL Server 變數中使用 FOR JSON 輸出

FOR JSON 子句的輸出類型為 nvarchar(max),因此您可以將它指派給任何變數,如下列範例所示。

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

在 SQL Server 使用者定義函數中使用 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

Microsoft 影片

如需 SQL Server 和 Azure SQL Database 中內建 JSON 支援的觀看式簡介,請參閱下列影片: