我尝试使用最新版本的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对象?
答案 0 :(得分:2)
内置函数JSON_QUERY
从JSON字符串中提取对象或数组。
此查询应该有效。
SELECT
H.*,
JSON_QUERY( dbo.GetSalesOrderDetails(H.SalesOrderId) ) AS Details
FROM Sales.SalesOrderHeader H
FOR JSON AUTO
`