在 SQL 数据库引擎和客户端应用中使用 FOR JSON 输出

适用于:Microsoft Fabric 预览版中的 SQL Server 2016 (13.x) 及更高版本 AzureSQL数据库 AzureSynapse Analytics (仅限无服务器 SQL 池)SQL 数据库

以下示例演示了在 SQL Server 或客户端应用中使用 FOR JSON 子句及其 JSON 输出的一些方法。 有关详细信息,请参阅借助 FOR JSON 将查询结果的格式设置为 JSON

在 Fabric 数据仓库中, FOR JSON 必须是查询中的最后一个运算符,因此不允许在子查询中,如本文中的示例所示。

在 SQL 数据库引擎变量中使用 FOR JSON 输出

子句的 FOR JSON 输出的类型为 nvarchar(max),因此你可以将其分配给任何变量,如以下示例所示。

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

在 SQL 数据库引擎用户定义函数中使用 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 输出

下面的示例演示如何在 C# 客户端应用中将查询的 JSON 输出检索到 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 支持的视觉简介,请参阅以下视频: