2016-07-22 256 views
1

我想使用最新版本的SQL Server支持的FOR JSON子句聚合一些嵌套的JSON數據。SQL Server 2016「FOR JSON」格式嵌套JSON

比方說,我寫了一個函數,使用該子句導出一段JSON數據。由於不存在JSON類型,因此此函數返回NVARCHAR(MAX)值。

現在假設我想使用這段JSON作爲另一個函數的字段的值,該字段通過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 

現在,如果你試圖用內的另一個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}]" 
    } 
] 

正如您所看到的,該查詢的結果無法一次性解析,但需要第二次解析Details字段。

有沒有辦法告訴FOR JSON子句將字段解釋爲JSON數組或JSON對象?

回答

2

內置函數JSON_QUERY從JSON字符串中提取對象或數組。

此查詢應該有效。

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

`

+0

不幸的是,'JSON_QUERY'函數的返回值仍然'NVARCHAR(MAX)',所以外'FOR JSON AUTO'子句仍然將其解釋爲在SQL字符串 – Francesco

+0

JSON功能服務器對字符串(varchar或nvarchar)進行操作並返回,無論該字符串是否爲格式正確的JSON字符串,都將決定FOR JSON AUTO如何解析它。 看看這段*防止在JSON輸出* FOR FOR JSON輸出中的雙轉義JSON https://msdn.microsoft.com/en-us/library/mt631706.aspx – Mono

+0

我很抱歉,我重新檢查了我所做的測試昨天,事實上,你的解決方案的作品!我不知道我是如何錯過的!順便說一下,JSON_QUERY存在的每個級別的引擎是否都解析和字符串JSON?這可能會對業績造成相當大的影響? – Francesco