首页 > 解决方案 > 在 SQL 中的 JSON 中创建 JSON 数组

问题描述

我有如下 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)

在 JSON 的 DELTA 部分中获取 3 行背后的逻辑是:
对于 TabName TAB3,如果 P 存在于 TABLE2 中的任何方法中,则选择 ParentTab 值并将其与 TABLE2 中的 TabName 进行比较并获取其详细信息。这是一个递归循环,直到我们在任何方法中遇到 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

在创建我的 JSON 的 DELTA 部分时需要帮助,这将取决于我作为输入传递给函数的 TabName。

提前致谢。

标签: sqljsonsql-serverazure-sql-database

解决方案


这个答案有点晚了,但这应该会给你你正在寻找的东西。重要的是要注意递归 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

推荐阅读