2016-07-22 8 views
1

最新のSQL ServerでサポートされているFOR JSON句を使用して、いくつかのネストされたJSONデータを集計しようとしています。SQL Server 2016「JSON」の形式でJSONをネストした

たとえば、この節を使用してJSONデータをエクスポートする関数を作成します。 JSON型が存在しないため、この関数はNVARCHAR(MAX)の値を返します。

ここでは、JSONデータをFOR JSON節で返す別の関数のフィールドの値として、このJSONを使用したいとします。

残念ながら、文字列として保存する以外に、これを行う方法はありません。これにより、JSONデータのネストが効果的に中断されます。あなたが別のFOR JSONSELECTの内側に、この機能を使用しようとした場合は今

CREATE FUNCTION GetSalesOrderDetails(@salesOrderId int) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    RETURN (SELECT UnitPrice, OrderQty 
      FROM Sales.SalesOrderDetail 
      WHERE SalesOrderID = @salesOrderId 
      FOR JSON AUTO) 
END 

たとえば、JSONの配列は、(直接、マイクロソフトの例から)としてオブジェクトをエクスポートし、この機能を取る

[ 
    { 
    "Id": 12, 
    "Details": "[{\"UnitPrice\":12, \"OrderQty\":1}]" 
    } 
] 
SELECT H.*, dbo.GetSalesOrderDetails(H.SalesOrderId) AS Details 
FROM Sales.SalesOrderHeader H 
FOR JSON AUTO 

のようなものを作るだろう

ご覧のとおり、このクエリの結果は一度に解析できませんでしたが、詳細フィールドの2回目の解析が必要になります。

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)'ので、JSON AUTO'句は依然としてSQLで文字列 – Francesco

+0

JSON関数として解釈は 'アウターサーバーは文字列が正しくフォーマットされたJSON文字列であるかどうかにかかわらず、文字列(varcharまたはnvarchar)を操作して返します。JSON AUTOがどのように解析するかを決定します。 の* JSON出力での二重エスケープJSONの防止セクションをご覧くださいhttps://msdn.microsoft.com/en-us/library/mt631706.aspx – Mono

+0

大変申し訳ありませんが、私が行ったテストを再確認しました。昨日、あなたのソリューションは実際に動作します!どのように私はそれを逃したのか分からない!ちなみに、エンジンはJSON_QUERYが存在するすべてのレベルでJSONを解析してストリング化していますか?それはパフォーマンスの権利でかなり大きなヒットかもしれませんか? – Francesco

関連する問題