-- Hàm trả về các nút gốc trong cấu trúc cây hierarchyid --
-- by code4viet --
-- Do chúng ta dùng cấu cấu hierarchyid nên sẽ
-- không lưu trường ParentID theo cấu trúc cây truyền thống --
-- Theo cấu trúc cây truyền thống chúng ta muốn tìm nút gốc thường điều kiện sẽ là ParentID is null --
-- Còn theo cấu trúc cây hierarchyid muốn tìm nút gốc phải dùng hàm hierarchyid::GetRoot()
-- với điều kiện là OrgNode=hierarchyid::GetRoot()
declare @code4viet_newchildren table
(
ID int,
ParentID int,
Num int,
OrgNode hierarchyid,
LogicalNode nvarchar(max)
);
declare @code4viet_children table
(
ID int,
ParentID int,
Num int
);
-- dữ liệu mẫu --
INSERT @code4viet_children
(ID, ParentID, Num)
select 1, NULL , 1
union all
select 2, 1, 1
union all
select 16, 1, 2
union all
select 25, 1, 3
union all
select 234, 1, 4
union all
select 263, 1, 5
union all
select 273, 1, 6
union all
select 3, 2, 1
union all
select 4, 3, 1
union all
select 5, 3, 2
union all
select 6, 3, 3
union all
select 7, 3, 4
union all
select 300, NULL , 1
union all
select 301, 300, 1
;
-- kiểm tra dữ liệu mẫu --
-- select * from @code4viet_children;
-- tạo dữ liệu theo cấu trúc mới --
WITH
paths(path, ID)
AS
(
-- Lấy giá trị nút gốc
SELECT hierarchyid::GetRoot() AS OrgNode, ID
FROM @code4viet_children AS C
WHERE ParentID IS NULL
UNION ALL
-- Phần này cung cấp các giá trị cho tất cả các nút ngoại trừ nút gốc
SELECT
CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid),
C.ID
FROM @code4viet_children AS C
JOIN paths AS p
ON C.ParentID = P.ID
)
-- điền dữ liệu mới vào bảng --
insert into @code4viet_newchildren
(OrgNode,LogicalNode,ID,ParentID,Num)
select a.[path], a.[path].ToString() AS LogicalNode, ID=a.ID, b.ParentID, b.Num
from paths a inner join @code4viet_children b on a.ID=b.ID;
-- kiểm tra dữ liệu --
select N'-- dữ liệu đầy đủ --'
select *
from @code4viet_newchildren
order by LogicalNode
-- Các hàm trong cấu trúc hierarchyid --
/*
hierarchyid::GetRoot()
node.GetLevel()
*/
select N'-- chỉ lấy dữ liệu là nút gốc --'
-- chỉ lấy dữ liệu là nút gốc --
select *
from @code4viet_newchildren
WHERE OrgNode = hierarchyid::GetRoot()
order by LogicalNode
Không có nhận xét nào :
Đăng nhận xét