這是這個問題的一部分。我有用于存盤分層資料的Departments表。HierarchyId
| ID | 等級 ID | 姓名 |
|---|---|---|
| 1 | / | 兆赫 |
| 2 | /2/ | 金融 |
| 3 | /3/ | 它 |
| 4 | /3/4/ | 軟體開發 |
| 5 | /3/5/ | 質量保證 |
| 6 | /2/6/ | 會計 |
我想把這張桌子放在前面JSON的TreeView上。
我做了什么:
CREATE FUNCTION dbo.GetDepartmentAsJson
(@departmentId hierarchyid,
@IsRoot int)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @Json NVARCHAR(MAX) = '{}',
@Id int,
@Name varchar(50),
@Children NVARCHAR(MAX) = '{}',
@Hierar Hierarchyid
SET @Json = (SELECT
t.Id, t.HierarchyId, t.Name,
children = JSON_QUERY(dbo.GetDepartmentAsJson(t.HierarchyId, 2))
FROM Departments t
WHERE t.HierarchyId <> @departmentId
AND t.HierarchyId.IsDescendantOf(@departmentId) = 1
FOR JSON PATH);
IF (@IsRoot = 1)
BEGIN
SELECT
@Id = t.Id,
@Hierar = t.HierarchyId,
@Name = t.Name
FROM
Departments t
WHERE
t.HierarchyId = @departmentId;
SET @Json =
'{"Id":"' CONVERT(varchar(7), @Id)
'","HierarchyId":"' @Hierar.ToString()
'","Name":"' @Name
'","Children":' CAST(@Json AS NVARCHAR(MAX)) '}';
SET @IsRoot = 2;
END
RETURN @Json;
END;
結果:
{
"Id": "1",
"HierarchyId": "/",
"Name": "MHz",
"Children": [
{
"Id": 2,
"HierarchyId": "/2/",
"Name": "Finance",
"Children": [
{
"Id": 6,
"HierarchyId": "/2/6/",
"Name": "Accountant"
}
]
},
/* This should not be listed because already included as a child in Finance */
{
"Id": 6,
"HierarchyId": "/2/6/",
"Name": "Accountant"
},
{
"Id": 3,
"HierarchyId": "/3/",
"Name": "IT",
"Children": [
{
"Id": 4,
"HierarchyId": "/3/4/",
"Name": "Software Development"
},
{
"Id": 5,
"HierarchyId": "/3/5/",
"Name": "QA"
}
]
},
/* They both should not be listed because already included as a child in IT */
{
"Id": 4,
"HierarchyId": "/3/4/",
"Name": "Software Development"
},
{
"Id": 5,
"HierarchyId": "/3/5/",
"Name": "QA"
}
]
}
如何排除已在父元素中列出的子元素?
uj5u.com熱心網友回復:
您還應該檢查后代的級別
CREATE FUNCTION dbo.GetDepartmentAsJson(@departmentId hierarchyid, @level int)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @Json NVARCHAR(MAX) = '{}',
@Id int,
@Name varchar(50),
@Childeren NVARCHAR(MAX) = '{}',
@Hierar Hierarchyid
SET @Json = (SELECT
t.Id,
t.HierarchyId,
t.Name,
children = JSON_QUERY(dbo.GetDepartmentAsJson(t.HierarchyId, @level 1))
FROM Departments t
WHERE t.HierarchyId <> @departmentId
AND t.HierarchyId.IsDescendantOf(@departmentId) = 1 and t.HierarchyId.GetLevel() = @level 1
FOR JSON PATH);
IF(@level = 0)
BEGIN
SELECT
@Id = t.Id,
@Hierar = t.HierarchyId,
@Name = t.Name
FROM Departments t
WHERE t.HierarchyId = @departmentId;
SET @Json =
'{"Id":"' CONVERT(varchar(7), @Id)
'","HierarchyId":"' @Hierar.ToString()
'","Name":"' @Name
'","Children":' CAST(@Json AS NVARCHAR(MAX)) '}';
END
return @Json;
END;
層次結構的根是級別 0,所以select dbo.GetDepartmentAsJson ('/', 0)
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463021.html
上一篇:如何獲取json索引作為鍵?
