sql - 从 SQL Server 获取 JSON 格式的分层数据

标签 sql json sql-server hierarchy

我有下表:

<表类=“s-表”> <标题> ID 层次结构ID 姓名 <正文> 1 / 兆赫 2 /1/ 金融 3 /1/ IT 4 /1/3/ 软件开发 5 /1/3/ 质量检查 6 /1/2/ 会计师

我想获取我的 TreeView 的数据像:

[
{
  "Id": 1,
  "HierarchyId": "/"
  "Name":"MHz",
  "Children":[
     {
        "Id": 3,
        "HierarchyId": "/1/"
        "Name":"IT",
        "Children":[
           {
              "Id": 4,
              "HierarchyId": "/1/3/"
              "Name":"Software Development",
              "Children":[]
           }
           {
              "Id": 5,
              "HierarchyId": "/1/3/"
              "Name":"QA",
              "Children":[]
           }
        ]
     },
     {
        "Id": 2,
        "HierarchyId": "/1/"
        "Name":"Finance",
        "Children":[
           {
              "Id": 6,
              "HierarchyId": "/1/2/"
              "Name":"Accountant",
              "Children":[]
           }
        ]
     }
   ]
 }
]

我尝试过这个:How to generate hierarchical JSON data

出现错误:No more lock classes available from transaction.

或者创建递归函数并填充 Tree 更好吗?上client side

更新

CREATE FUNCTION dbo.GetJson (@departmentId hierarchyid)
RETURNS nvarchar(max)
AS BEGIN
RETURN (
    SELECT
      Id,
      HierarchyId,
      Name,
      children = JSON_QUERY(dbo.GetJson(HierarchyId))
    FROM Departments p
    WHERE p.HierarchyId.IsDescendantOf(@departmentId ) = 1
    FOR JSON PATH
);
END;

最佳答案

我发现做到这一点的最好方法是使用递归函数。

您可以自连接所有节点并使用 GetAncestor 检查它们是否是子节点

CREATE FUNCTION dbo.GetJson (@parentID hierarchyid)
RETURNS nvarchar(max)
AS BEGIN
    RETURN (
        SELECT
          t.Id,
          t.HierarchyId,
          t.Name,
          children = JSON_QUERY(dbo.GetJson(t.HierarchyId))
        FROM Tree t
        WHERE t.HierarchyId <> @parentID
          AND t.HierarchyId.GetAncestor(1) = @parentID
        FOR JSON PATH
    );
END;

go
SELECT dbo.GetJson(hierarchyid::GetRoot());

db<>fiddle

结果

[
  {
    "Id": 1,
    "HierarchyId": "/1/",
    "Name": "MHz",
    "children": [
      {
        "Id": 2,
        "HierarchyId": "/1/2/",
        "Name": "Finance",
        "children": [
          {
            "Id": 6,
            "HierarchyId": "/1/2/6/",
            "Name": "Accountant"
          }
        ]
      },
      {
        "Id": 3,
        "HierarchyId": "/1/3/",
        "Name": "IT",
        "children": [
          {
            "Id": 4,
            "HierarchyId": "/1/3/4/",
            "Name": "Software Development"
          },
          {
            "Id": 5,
            "HierarchyId": "/1/3/5/",
            "Name": "QA"
          }
        ]
      }
    ]
  }
]

关于sql - 从 SQL Server 获取 JSON 格式的分层数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71953226/

相关文章:

sql - 用于分隔查询文件中多个查询的 PostgreSQL 定界符

json - 使用 NancyFx 中的对象数组进行模型绑定(bind) POST

c# - Entity Framework 使用模型与 sqlce 和 sql server/sql express 数据库

sql - 对 SQL Server 执行计划进行基准测试以进行自动化测试?

javascript - 如何使用 javascript 获取 XHTML 字符串并将其呈现在网页上

sql - 我可以与 HAVING 子句一起使用的第一个聚合函数

mysql - SQL - 对象是否具有所有必需的组件?

mysql - 根据数量和出现次数返回最频繁的 x

c# - 具有相同字段的两个表之间的 LINQ 联合,然后在集合中返回

json - 如何在 ng-click 的上下文中显示嵌套 JSON 的数据(Angular、JSON)