Sql server SQL Server 2016“;对于JSON“;格式化嵌套JSON
我试图使用SQL Server最新版本支持的Sql server SQL Server 2016“;对于JSON“;格式化嵌套JSON,sql-server,json,Sql Server,Json,我试图使用SQL Server最新版本支持的FOR JSON子句聚合一些嵌套的JSON数据 假设我编写了一个函数,使用该子句导出一段JSON数据。由于不存在JSON类型,此函数返回一个NVARCHAR(MAX)值 现在假设我想使用这段JSON作为另一个函数中的字段值,该函数通过for JSON子句返回JSON数据 不幸的是,除了将其存储为字符串之外,我看不到任何其他方法。这有效地打破了JSON数据的嵌套 例如,以导出JSON对象数组的函数为例,例如(直接来自Microsoft示例): 现在,如果
FOR JSON
子句聚合一些嵌套的JSON数据
假设我编写了一个函数,使用该子句导出一段JSON数据。由于不存在JSON类型,此函数返回一个NVARCHAR(MAX)
值
现在假设我想使用这段JSON作为另一个函数中的字段值,该函数通过for JSON
子句返回JSON数据
不幸的是,除了将其存储为字符串之外,我看不到任何其他方法。这有效地打破了JSON数据的嵌套
例如,以导出JSON对象数组的函数为例,例如(直接来自Microsoft示例):
现在,如果您试图在另一个JSON的子句中使用此函数,请选择:
SELECT H.*, dbo.GetSalesOrderDetails(H.SalesOrderId) AS Details
FROM Sales.SalesOrderHeader H
FOR JSON AUTO
会产生类似于:
[
{
"Id": 12,
"Details": "[{\"UnitPrice\":12, \"OrderQty\":1}]"
}
]
如您所见,无法一次性解析此查询的结果,但需要对Details字段进行第二次解析
有没有办法告诉FOR JSON
子句将字段解释为JSON数组或JSON对象?内置函数JSON\u QUERY
从JSON字符串中提取对象或数组
这个查询应该可以工作
SELECT
H.*,
JSON_QUERY( dbo.GetSalesOrderDetails(H.SalesOrderId) ) AS Details
FROM Sales.SalesOrderHeader H
FOR JSON AUTO
`不幸的是,JSON_QUERY
函数的返回值仍然是NVARCHAR(MAX)
,因此外部的FOR JSON AUTO
子句仍然将其解释为Sql server中的stringJSON函数操作并返回字符串(varchar或NVARCHAR),该字符串是否为格式正确的JSON字符串将决定FOR JSON自动解析该字符串的方式。请看上的“为JSON输出防止双重转义JSON”一节,非常抱歉,我重新检查了昨天进行的测试,事实上,您的解决方案是有效的!我不知道我怎么会错过那个!顺便问一下,引擎是否为存在JSON_查询的每个级别解析和字符串化JSON?这可能会对性能造成很大影响,对吧?是的,调用JSON_查询函数需要它解析传递给它的任何内容。不过,我不会太担心性能。
SELECT
H.*,
JSON_QUERY( dbo.GetSalesOrderDetails(H.SalesOrderId) ) AS Details
FROM Sales.SalesOrderHeader H
FOR JSON AUTO