2016-11-07 22 views
2

複数のフィールドで構成される複数のレンダリングからなるセクションがあるところにJSON構造があります。どのように配列の配列をOPENJSONする

そこからすべての情報を取得するには、最低レベル(フィールド)で1つのOPENJSONコールを実行するにはどうすればよいですか?ここで

は例JSONです:ここでは

Declare @layout NVARCHAR(MAX) = N' 
    { 
     "Sections": [ 
      { 
       "SectionName":"Section1", 
       "SectionOrder":1, 
       "Renders":[ 
        { 
         "RenderName":"Render1", 
         "RenderOrder":1, 
         "Fields":[ 
          { 
           "FieldName":"Field1", 
           "FieldData":"Data1" 
          }, 
          { 
           "FieldName":"Field2", 
           "FieldData":"Data2" 
          } 
         ] 
        }, 
        { 
         "RenderName":"Render2", 
         "RenderOrder":2, 
         "Fields":[ 
          { 
           "FieldName":"Field1", 
           "FieldData":"Data1" 
          }, 
          { 
           "FieldName":"Field2", 
           "FieldData":"Data2" 
          } 
         ] 
        } 
       ] 
      }, 
      { 
       "SectionName":"Section2", 
       "SectionOrder":2, 
       "Renders":[ 
        { 
         "RenderName":"Render1", 
         "RenderOrder":1, 
         "Fields":[ 
          { 
           "FieldName":"Field1", 
           "FieldData":"Data1" 
          } 
         ] 
        }, 
        { 
         "RenderName":"Render2", 
         "RenderOrder":2, 
         "Fields":[ 
          { 
           "FieldName":"Field1", 
           "FieldData":"Data1" 
          }, 
          { 
           "FieldName":"Field2", 
           "FieldData":"Data2" 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    } 
' 

は、私はそれ1作るのですか、働くネストされたOPENJSONコールのコードのいくつかの例であるが、非常に複雑で、動的に生成することができませんレベルコール?

SELECT SectionName, SectionOrder, RenderName, RenderOrder, FieldName, FieldData FROM (
    SELECT SectionName, SectionOrder, RenderName, RenderOrder, Fields FROM (
     select SectionName, SectionOrder, Renders 
     from OPENJSON(@layout,'$.Sections') 
     WITH (
      SectionName nvarchar(MAX) '$.SectionName', 
      SectionOrder nvarchar(MAX) '$.SectionOrder', 
      Renders nvarchar(MAX) '$.Renders' as JSON 
     ) 
    ) as Sections 
    CROSS APPLY OPENJSON(Renders,'$') 
    WITH (
     RenderName nvarchar(MAX) '$.RenderName', 
     RenderOrder nvarchar(MAX) '$.RenderOrder', 
     Fields nvarchar(MAX) '$.Fields' as JSON 
    ) 
) as Renders 
CROSS APPLY OPENJSON(Fields,'$') 
WITH (
    FieldName nvarchar(MAX) '$.FieldName', 
    FieldData nvarchar(MAX) '$.FieldData' 
) 

これは私が達成したいものです。

select FieldName, FieldData 
from OPENJSON(@layout,'$.Sections.Renders.Fields') 
WITH (
    FieldName nvarchar(MAX) '$.Sections.Renders.Fields.FieldName', 
    FieldData nvarchar(MAX) '$.Sections.Renders.Fields.FieldData' 
) 
+0

私はあなたが 'CROSS APPLY'ingを維持するために持っていると思う - つまり、私はあなたが単一' OPENJSON'にできることを知りません。 [この回答はあなたに必要なものを提供しますか](https://stackoverflow.com/a/372​​18450/1028230)? – ruffin

答えて

0

あなただけの単一OPENJSONを使用して逃げることはできませんが、あなたはそれが簡単に作成するために作るためにあなたのクエリビットを簡素化することができます動的にネストされたサブクエリを削除することによって:

SELECT SectionName, SectionOrder, RenderName, RenderOrder, FieldName, FieldData 
FROM OPENJSON(@layout, '$.Sections') 
WITH (
    SectionName NVARCHAR(MAX) '$.SectionName', 
    SectionOrder NVARCHAR(MAX) '$.SectionOrder', 
    Renders NVARCHAR(MAX) '$.Renders' AS JSON 
) 
CROSS APPLY OPENJSON(Renders,'$') 
WITH (
    RenderName NVARCHAR(MAX) '$.RenderName', 
    RenderOrder NVARCHAR(MAX) '$.RenderOrder', 
    Fields NVARCHAR(MAX) '$.Fields' AS JSON 
) 
CROSS APPLY OPENJSON(Fields,'$') 
WITH (
    FieldName NVARCHAR(MAX) '$.FieldName', 
    FieldData NVARCHAR(MAX) '$.FieldData' 
) 
関連する問題