2016-05-13 9 views
12

Ich habe einige JSON, die ich in SQL Server 2016 analysieren möchten. Es gibt eine Hierarchie Struktur von Projekte-> Strukturen-> Eigenschaften. Ich möchte eine Abfrage schreiben, die die gesamte Hierarchie analysiert, aber ich will keine Elemente nach Indexnummer angeben, dh ich will nicht so etwas wie dies zu tun:SQL Server OPENJSON lesen verschachtelten JSON

openjson (@json, '$[0]') 

oder

openjson (@json, '$.structures[0]') 

Ich hatte diese Idee, dass ich die Werte der Top-Level-Projektobjekte zusammen mit der JSON-Zeichenfolge lesen konnte, die die Strukturen darunter darstellt, die dann separat analysiert werden konnten. Das Problem ist, dass der folgende Code nicht funktioniert:

declare @json nvarchar(max) 
set @json = ' 
[ 
    { 
     "IdProject":"97A76363-095D-4FAB-940E-9ED2722DBC47", 
     "Name":"Test Project", 
     "structures":[ 
     { 
      "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F", 
      "IdProject":"97A76363-095D-4FAB-940E-9ED2722DBC47", 
      "Name":"Test Structure", 
      "BaseStructure":"Base Structure", 
      "DatabaseSchema":"dbo", 
      "properties":[ 
       { 
        "IdProperty":"618DC40B-4D04-4BF8-B1E6-12E13DDE86F4", 
        "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F", 
        "Name":"Test Property 2", 
        "DataType":1, 
        "Precision":0, 
        "Scale":0, 
        "IsNullable":false, 
        "ObjectName":"Test Object", 
        "DefaultType":1, 
        "DefaultValue":"" 
       }, 
       { 
        "IdProperty":"FFF433EC-0BB5-41CD-8A71-B5F09B97C5FC", 
        "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F", 
        "Name":"Test Property 1", 
        "DataType":1, 
        "Precision":0, 
        "Scale":0, 
        "IsNullable":false, 
        "ObjectName":"Test Object", 
        "DefaultType":1, 
        "DefaultValue":"" 
       } 
      ] 
     } 
     ] 
    } 
]'; 

select IdProject, Name, structures 
from openjson (@json) 
with 
(
    IdProject uniqueidentifier, 
    Name nvarchar(100), 
    structures nvarchar(max) 
) as Projects 

IdProject und Namen kein Problem zurück zu bekommen, aber aus irgendeinem Grunde kann ich nicht die verschachtelte json in ‚Strukturen‘ gehalten bekommen. Anstelle des json Inhalt gibt es nur NULL:

enter image description here

Wer weiß, ob dies möglich ist und wenn ja, was mache ich falsch?

Antwort

20

Wenn Sie JSON-Objekt oder Array-Referenz müssen Sie als JSON-Klausel angeben:

select IdProject, Name, structures 
from openjson (@json) 
with 
(
    IdProject uniqueidentifier, 
    Name nvarchar(100), 
    structures nvarchar(max) AS JSON 
) as Projects 

Siehe FAQ: https://msdn.microsoft.com/en-us/library/mt631706.aspx#Anchor_6

Wenn Sie OPENJSON auf dem zurückgegebenen Strukturen Array anwenden möchten, können Sie so etwas wie folgenden Code verwenden:

select IdProject, Name, structures 
from openjson (@json) 
with 
(
    IdProject uniqueidentifier, 
    Name nvarchar(100), 
    structures nvarchar(max) AS JSON 
) as Projects 
    CROSS APPLY OPENJSON (structures) WITH (......) 
1

Typisch! Ich habe die Antwort direkt nach dem Posten der Frage gefunden. Sie müssen die ‚als json‘ Schlüsselwort verwenden, wenn die Spalten Angabe zurückzukehren:

select IdProject, Name, structures 
from openjson (@json) 
with 
(
    IdProject uniqueidentifier, 
    Name nvarchar(100), 
    structures nvarchar(max) as json 
) as Projects 
6

Mit KREUZ ANWENDUNG:

declare @json nvarchar(max) 
set @json = ' 
[ 
    { 
     "IdProject":"97A76363-095D-4FAB-940E-9ED2722DBC47", 
     "Name":"Test Project", 
     "structures":[ 
     { 
      "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F", 
      "IdProject":"97A76363-095D-4FAB-940E-9ED2722DBC47", 
      "Name":"Test Structure", 
      "BaseStructure":"Base Structure", 
      "DatabaseSchema":"dbo", 
      "properties":[ 
       { 
        "IdProperty":"618DC40B-4D04-4BF8-B1E6-12E13DDE86F4", 
        "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F", 
        "Name":"Test Property 2", 
        "DataType":1, 
        "Precision":0, 
        "Scale":0, 
        "IsNullable":false, 
        "ObjectName":"Test Object", 
        "DefaultType":1, 
        "DefaultValue":"" 
       }, 
       { 
        "IdProperty":"FFF433EC-0BB5-41CD-8A71-B5F09B97C5FC", 
        "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F", 
        "Name":"Test Property 1", 
        "DataType":1, 
        "Precision":0, 
        "Scale":0, 
        "IsNullable":false, 
        "ObjectName":"Test Object", 
        "DefaultType":1, 
        "DefaultValue":"" 
       } 
      ] 
     } 
     ] 
    } 
]'; 

select 
    Projects.IdProject, Projects.Name as NameProject, 
    Structures.IdStructure, Structures.Name as NameStructure, Structures.BaseStructure, Structures.DatabaseSchema, 
    Properties.*  
from openjson (@json) 
with 
(
    IdProject uniqueidentifier, 
    Name nvarchar(100), 
    structures nvarchar(max) as json 
) 
as Projects 
cross apply openjson (Projects.structures) 
with 
(
    IdStructure uniqueidentifier, 
    Name nvarchar(100), 
    BaseStructure nvarchar(100), 
    DatabaseSchema sysname, 
    properties nvarchar(max) as json 
) as Structures 
cross apply openjson (Structures.properties) 
with 
(
    IdProperty uniqueidentifier, 
    NamePreoperty nvarchar(100) '$.Name', 
    DataType int, 
    [Precision] int, 
    [Scale] int, 
    IsNullable bit, 
    ObjectName nvarchar(100), 
    DefaultType int, 
    DefaultValue nvarchar(100) 
) 
as Properties