员工组织结构图的T-SQL分层Json结果
我试图从SQLServer数据库中为公司组织结构图输出分层JSON 我想以类似的方式显示数据 我已经能够构建一个查询,将层次结构输出到一个平面表中,如下所示: 我能够通过使用FOR JSON PATH实现我想要的,但这只会真正为我提供一个层次结构所需的数据 有谁知道如何从T-SQL输出多个层次结构级别,以提供类似以下输出的内容:员工组织结构图的T-SQL分层Json结果,json,sql-server,tsql,Json,Sql Server,Tsql,我试图从SQLServer数据库中为公司组织结构图输出分层JSON 我想以类似的方式显示数据 我已经能够构建一个查询,将层次结构输出到一个平面表中,如下所示: 我能够通过使用FOR JSON PATH实现我想要的,但这只会真正为我提供一个层次结构所需的数据 有谁知道如何从T-SQL输出多个层次结构级别,以提供类似以下输出的内容: { 'name': 'Lao Lao', 'title': 'general manager', 'ch
{
'name': 'Lao Lao',
'title': 'general manager',
'children': [
{ 'name': 'Bo Miao', 'title': 'department manager' },
{ 'name': 'Su Miao', 'title': 'department manager',
'children': [
{ 'name': 'Tie Hua', 'title': 'senior engineer' },
{ 'name': 'Hei Hei', 'title': 'senior engineer',
'children': [
{ 'name': 'Pang Pang', 'title': 'engineer' },
{ 'name': 'Xiang Xiang', 'title': 'UE engineer'
'children': [
{'name': 'Pang Pang2', 'title': 'engineer'},
{'name': 'Pang Pang3', 'title': 'engineer'}
]
}
]
}
]
},
{ 'name': 'Yu Jie', 'title': 'department manager' },
{ 'name': 'Yu Li', 'title': 'department manager' },
{ 'name': 'Hong Miao', 'title': 'department manager' },
{ 'name': 'Yu Wei', 'title': 'department manager' },
{ 'name': 'Chun Miao', 'title': 'department manager' },
{ 'name': 'Yu Tie', 'title': 'department manager' }
]
}
});
我已经尝试了好几个小时了,我还没有找到解决方案,网络上的任何东西似乎都帮不了我
谢谢我找到了一篇非常好的文章,帮助我实现了我需要做的事情。 这不是最快的解决方案,但很有效 这本Microsoft指南也非常有用: 有了这两个指南,我能够构建出一些有效的东西,我仍然需要清理代码,但这里是我最后得到的,以防这对其他人有所帮助
IF(OBJECT_ID('dbo.Org') IS NOT NULL)
DROP TABLE dbo.Org;
CREATE TABLE dbo.Org
(
OrgNode hierarchyid,
Id int,
FullName nvarchar(500),
ManagerId int,
CONSTRAINT PK_Org_OrgNode
PRIMARY KEY CLUSTERED (OrgNode)
);
DECLARE @Children TABLE (
Id int,
ManagerId int,
Num int
);
INSERT @Children (Id, ManagerId, Num)
SELECT Id, ManagerId,
ROW_NUMBER() OVER (PARTITION BY ManagerId ORDER BY ManagerId)
FROM dbo.Employees;
WITH paths(path, Id)
AS (
SELECT hierarchyid::GetRoot() AS OrgNode, Id
FROM @Children AS C
WHERE Id = <CEO ID>
UNION ALL
SELECT
CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid),
C.Id
FROM @Children AS C
JOIN paths AS p
ON C.ManagerId = P.Id
AND C.ManagerId <> C.Id
)
INSERT dbo.Org (OrgNode, O.Id, O.FullName, O.ManagerId)
SELECT P.path, O.Id, O.UserPrincipalName, O.ManagerId
FROM dbo.Employees AS O
JOIN Paths AS P
ON O.Id = P.Id
OPTION (maxrecursion 10000);
IF Object_Id('dbo.JSONHierarchicalListOfReports', 'FN') IS NOT null
DROP FUNCTION dbo.JSONHierarchicalListOfReports;
GO
/* create the function that creates a JSON representation of the hierarchy */
CREATE FUNCTION JSONHierarchicalListOfReports(@Me HIERARCHYID)
RETURNS NVARCHAR(MAX)
BEGIN
RETURN
(SELECT
Coalesce((SELECT '{'+
'"name":"' +String_Escape(me.FullName, 'json')+'","title":"' + String_Escape(me.FullName, 'json') + '","children":['+Stuff( --get a list of reports
(SELECT ',' + dbo.JSONHierarchicalListOfReports(reports.OrgNode)
FROM dbo.Org AS reports
WHERE reports.OrgNode.GetAncestor(1) = me.OrgNode
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)'),1, 1,'')+']}'
),'{"name":"'+String_Escape(me.FullName, 'json')+'","title":"'+String_Escape('JOB TITLE HERE', 'json')+'"}') AS reports
FROM dbo.Org AS me
WHERE me.OrgNode = @Me
);
END;
GO
SELECT dbo.JSONHierarchicalListOfReports(OrgNode)
FROM dbo.Org
where dbo.Org.Id = <CEO ID>
请阅读一些关于改进您的问题的提示。DDL和可消费数据帮助我们帮助您。没有数据类型的部分数据的映像不会。
{"name":"abc@abc.com","title":"Manger","children":[{"name":"test.user5555@abc.com","title:":"Worker"}]}