2016-05-13 4 views
12

У меня есть json, который я бы хотел проанализировать в SQL Server 2016. Существует иерархическая структура Projects-> Structures-> Properties. Я хотел бы написать запрос, который анализирует всю иерархию, но я не хочу, чтобы указать какие-либо элементы по номеру индекса т.е. я не хочу, чтобы сделать что-нибудь вроде этого:SQL Server OPENJSON read inested json

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

или

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

У меня возникла идея, что я могу читать значения объектов проекта верхнего уровня вместе с json-строкой, которая представляет структуры ниже нее, которые затем могут анализироваться отдельно. Проблема заключается в том, что следующий код не работает:

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 он просто возвращает NULL:

enter image description here

Кто-нибудь знает, если это возможно, и если да, то что я делаю не так?

ответ

20

Если объект ссылки JSON или массива необходимо указать AS статьи JSON:

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

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

Если вы хотите применить OPENJSON на массив, возвращаемый структуры, вы можете использовать что-то вроде следующего кода:

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

Типичный! Я нашел ответ сразу после публикации вопроса. Вы должны использовать «как JSON» ключевое слово при определении столбцов для возврата:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^