2016-05-13 13 views
12

पढ़ा है मेरे पास कुछ जेसन है जो मैं SQL Server 2016 में पार्स करना चाहता हूं। परियोजनाओं की एक पदानुक्रम संरचना-> संरचनाएं-> गुण। मैं एक प्रश्न है कि पूरे पदानुक्रम को पार्स करता है लिखने के लिए चाहते हैं, लेकिन मैं यानी मैं इस तरह कुछ भी नहीं करना चाहती सूचकांक संख्या से किसी भी तत्व को निर्दिष्ट करने के लिए नहीं करना चाहती:SQL सर्वर OPENJSON नेस्टेड जेसन

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

या

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

मुझे यह विचार था कि मैं जेएसएन स्ट्रिंग के साथ शीर्ष स्तरीय प्रोजेक्ट ऑब्जेक्ट्स के मानों को पढ़ सकता हूं जो इसके नीचे संरचनाओं का प्रतिनिधित्व करता है, जिसे अलग से पार्स किया जा सकता है। समस्या यह है कि निम्नलिखित कोड काम नहीं करता है:

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 और नाम कोई समस्या नहीं लौटे हो लेकिन किसी कारण से मैं नेस्टेड json 'संरचनाओं' में आयोजित नहीं मिल सकता है। इसके बजाय json सामग्री की यह सिर्फ रिटर्न शून्य:

enter image description here

किसी को भी पता है कि अगर यह संभव है और यदि हां, तो क्या मैं गलत कर रहा हूँ?

उत्तर

20

आप JSON ऑब्जेक्ट या सरणी संदर्भ यदि आप JSON खंड के रूप में निर्दिष्ट करने की आवश्यकता: आप वापस जाने के लिए जब स्तंभों को निर्दिष्ट 'json के रूप में' कुंजी शब्द का उपयोग करने की आवश्यकता है:

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 (......) 
: https://msdn.microsoft.com/en-us/library/mt631706.aspx#Anchor_6

आप वापस आ संरचनाओं सरणी पर OPENJSON लागू करना चाहते हैं, तो आपको निम्न कोड की तरह कुछ का उपयोग कर सकते 0

1

विशिष्ट! मुझे प्रश्न पोस्ट करने के बाद ही जवाब मिला।

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

पूछे जाने वाले प्रश्न देखें:

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

क्रॉस आवेदन का उपयोग:

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 
संबंधित मुद्दे