Создайте массив JSON в JSON в SQL - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть 2 таблицы, как показано ниже, и в настоящее время я пишу функцию, которая возвращает JSON на основе этих таблиц.Нужна помощь в запросе этого.

 TABLE1
 Id    ReqMode    RespMode    Count    TabName   
 1001  R          T           5000     TAB3
 1002  R          Y           10000    TAB4
 1003  R          T           3000     TAB6
 1004  R          T           5000     TAB5
 1005  R          Y           6000     TAB2


 TABLE2
 TabName  CMeth  CDate  UMeth  UDate DMeth  DDate  ParentTab  
 TAB1     F      A1     F      L1    C
 TAB2     P             C            C             TAB1
 TAB3     P             C            C             TAB2
 TAB4     F      B5     C            C                
 TAB5     P             C            C             TAB4
 TAB6     C             C            C

JSON Формат:

{  
   "d":{  
      "Id":"1001",
      "ReqMode":"R",
      "RespMode":"T",
      "Count":5000,
      "TabName":"TAB3",
      "DELTA":[  
         {  
            "Tabname":"TAB3",
            "CMeth":"P",
            "CDate":"",
            "UMeth":"C",
            "UDate":"",
            "DMeth":"C",
            "DDate":"",
            "ParentTab":"TAB2"
         },
         {  
            "Tabname":"TAB2",
            "CMeth":"P",
            "CDate":"",
            "UMeth":"C",
            "UDate":"",
            "DMeth":"C",
            "DDate":"",
            "ParentTab":"TAB1"
         },
         {  
            "Tabname":"TAB1",
            "CMeth":"F",
            "CDate":"A1",
            "UMeth":"F",
            "UDate":"L1",
            "DMeth":"",
            "DDate":"C",
            "ParentTab":""
         }
      ],
      "MDATA":[ ]
   }
}

Объяснение:
Если я запрашиваю 'TAB3', то мне нужно извлечь запись из TABLE1, где TabName - TAB3.Основываясь на этом имени таблицы, я проверяю его значения в TABLE2.
Мои методы имеют значения P (Parent), C (Change), F (Field)

Логика, лежащая в основе получения 3 строк здесь, в моемDELTA-часть JSON:
Для TabName TAB3, если P присутствует в любом из методов TABLE2, выберите значение ParentTab и сопоставьте его с TabName в TABLE2 и получите его детали.Это рекурсивный цикл, пока мы не встретим C или F. ни в одном из методов.

В настоящее время я теряюсь в том, как создать рекурсивный цикл на основе значений.Мой запрос на данный момент:

select Id AS 'd.Id', ReqMode AS 'd.ReqMode' ,RespMode AS 'd.RespMode',Count AS 'd.Count',TabName AS 'd.TabName'
,JSON_QUERY('[]') 'd.DELTA',JSON_QUERY('[]') 'd.MDATA'
FROM TABLE1 
FOR JSON PATH

Нужна помощь в создании DELTA-части моего JSON, которая будет зависеть от TabName, которое я передаю в качестве входных данных для функции.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Этот ответ немного запоздал, но он должен дать вам то, что вы ищете.Важно отметить, что рекурсивные cte имеют ограничение по умолчанию 100, но вы можете использовать опцию MAXRECURSION, чтобы настроить разумный предел для вашей ситуации.

declare @id int = 1001
declare @tab varchar(100) = (select tabName from Table1 where id = @id);

with delta as (
    select tabname,cmeth,isnull(cdate,'') as cdate
      ,umeth,isnull(udate,'') as udate
      ,dmeth,isnull(ddate,'') as ddate
      ,isnull(parenttab,'') as parenttab 
    from dbo.Table2 
    where tabname = @tab
    union all
    select t.tabname,t.cmeth,isnull(t.cdate,'') as cdate
      ,t.umeth,isnull(t.udate,'') as udate
      ,t.dmeth,isnull(t.ddate,'') as ddate
      ,isnull(t.parenttab,'') as parenttab  
    from dbo.Table2 t 
      inner join delta d on t.tabname = d.parenttab
)
SELECT ID as 'd.id'
    ,ReqMode as 'd.reqmode'
    ,RespMode as 'd.respmode'
    ,[Count] as 'd.count'
    ,TabName as 'd.tabname'
    ,json_query((select distinct * from delta for json path)) as delta
    ,json_query('[]') as mdata
FROM dbo.Table1 T1
WHERE ID = @id
FOR JSON PATH;
go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...