最新のSQL ServerでサポートされているFOR JSON
句を使用して、いくつかのネストされたJSONデータを集計しようとしています。SQL Server 2016「JSON」の形式でJSONをネストした
たとえば、この節を使用してJSONデータをエクスポートする関数を作成します。 JSON型が存在しないため、この関数はNVARCHAR(MAX)
の値を返します。
ここでは、JSONデータをFOR JSON
節で返す別の関数のフィールドの値として、このJSONを使用したいとします。
残念ながら、文字列として保存する以外に、これを行う方法はありません。これにより、JSONデータのネストが効果的に中断されます。あなたが別のFOR JSON
句SELECT
の内側に、この機能を使用しようとした場合は今
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オブジェクトとして解釈させる方法はありますか?
残念なことに' JSON_QUERY'関数の戻り値は依然として 'NVARCHAR(MAX)'ので、JSON AUTO'句は依然としてSQLで文字列 – Francesco
JSON関数として解釈は 'アウターサーバーは文字列が正しくフォーマットされたJSON文字列であるかどうかにかかわらず、文字列(varcharまたはnvarchar)を操作して返します。JSON AUTOがどのように解析するかを決定します。 の* JSON出力での二重エスケープJSONの防止セクションをご覧くださいhttps://msdn.microsoft.com/en-us/library/mt631706.aspx – Mono
大変申し訳ありませんが、私が行ったテストを再確認しました。昨日、あなたのソリューションは実際に動作します!どのように私はそれを逃したのか分からない!ちなみに、エンジンはJSON_QUERYが存在するすべてのレベルでJSONを解析してストリング化していますか?それはパフォーマンスの権利でかなり大きなヒットかもしれませんか? – Francesco