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對象?
不幸的是,'JSON_QUERY'函數的返回值仍然'NVARCHAR(MAX)',所以外'FOR JSON AUTO'子句仍然將其解釋爲在SQL字符串 – Francesco
JSON功能服務器對字符串(varchar或nvarchar)進行操作並返回,無論該字符串是否爲格式正確的JSON字符串,都將決定FOR JSON AUTO如何解析它。 看看這段*防止在JSON輸出* FOR FOR JSON輸出中的雙轉義JSON https://msdn.microsoft.com/en-us/library/mt631706.aspx – Mono
我很抱歉,我重新檢查了我所做的測試昨天,事實上,你的解決方案的作品!我不知道我是如何錯過的!順便說一下,JSON_QUERY存在的每個級別的引擎是否都解析和字符串JSON?這可能會對業績造成相當大的影響? – Francesco