SQL Server 2016" FOR JSON"格式化嵌套的JSON

时间:2016-07-22 18:15:55

标签: sql-server json

我尝试使用最新版本的SQL Server支持的FOR JSON子句聚合一些嵌套的JSON数据。

假设我写了一个使用该子句导出一段JSON数据的函数。由于不存在JSON类型,因此该函数返回NVARCHAR(MAX)值。

现在假设我想使用这段JSON作为另一个函数中字段的值,该函数通过FOR JSON子句返回JSON数据。

不幸的是,除了将其存储为字符串之外,我认为没有办法做到这一点。这有效地破坏了JSON数据的嵌套。

例如,使用此函数导出一组JSON对象,例如(直接来自Microsoft示例):

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

现在,如果您尝试在另一个FOR JSON子句SELECT中使用此函数:

SELECT H.*, dbo.GetSalesOrderDetails(H.SalesOrderId) AS Details  
FROM Sales.SalesOrderHeader H
FOR JSON AUTO

会产生类似的东西:

[
  {
    "Id": 12,
    "Details": "[{\"UnitPrice\":12, \"OrderQty\":1}]"
  }
]

正如您所看到的,此查询的结果无法一次性解析,但需要对“详细信息”字段进行第二次解析。

有没有办法告诉FOR JSON子句将字段解释为JSON数组或JSON对象?

1 个答案:

答案 0 :(得分:2)

内置函数JSON_QUERY从JSON字符串中提取对象或数组。

此查询应该有效。

SELECT
    H.*, 
    JSON_QUERY( dbo.GetSalesOrderDetails(H.SalesOrderId) ) AS Details
FROM Sales.SalesOrderHeader H
FOR JSON AUTO

`