Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2016“;对于JSON“;格式化嵌套JSON_Sql Server_Json - Fatal编程技术网

Sql server SQL Server 2016“;对于JSON“;格式化嵌套JSON

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示例): 现在,如果

我试图使用SQL Server最新版本支持的
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