我是SQL Server 2008的新手,刚刚介绍了HierarchyId。
我正在向SQL Server 2008 - HIERARCHYID - PART I学习。所以基本上我是逐行跟踪文章,在SSMS中练习时,我发现每个ChildId都会生成一些十六进制值,如0x,0x58,0x5AC0等。
我的问题是
答案 0 :(得分:11)
这些十六进制值只是层次结构级别的二进制表示。通常,您不应直接使用它们。
您可能想查看以下示例,我认为该示例应该是不言自明的。我希望它会让你朝着正确的方向前进。
创建一个包含hierarchyid
字段的表格:
CREATE TABLE groups (
group_name nvarchar(100) NOT NULL,
group_hierarchy hierarchyid NOT NULL
);
插入一些值:
INSERT INTO groups (group_name, group_hierarchy)
VALUES
('root', hierarchyid::Parse('/')),
('domain-a', hierarchyid::Parse('/1/')),
('domain-b', hierarchyid::Parse('/2/')),
('sub-a-1', hierarchyid::Parse('/1/1/')),
('sub-a-2', hierarchyid::Parse('/1/2/'));
查询表格:
SELECT
group_name,
group_hierarchy.ToString()
FROM
groups
WHERE
(group_hierarchy.IsDescendantOf(hierarchyid::Parse('/1/')) = 1);
答案 1 :(得分:0)
Adam Milazzo在这里写了一篇关于hierarchyid内部的伟大文章:
http://www.adammil.net/blog/view.php?id=100
简而言之,使用直接十六进制处理事物没有意义,而是将数字转换为二进制数。原因是事物不会在字节边界上被切断。如果它是前四个节点之一,则表示单个节点可以短至5位。随着更多节点的使用,变得越来越长,接下来的4个节点各6位,接下来的8个节点各7位,然后下一个64节点跳转到12位!然后,对于下一个1024,每个最多18位。
我需要将数据库转换为Postgres,并编写了一个解析这些十六进制值的脚本。你可以在这里查看我为AdventureWorks制作的版本,搜索" hierarchyid":
https://github.com/lorint/AdventureWorks-for-Postgres/blob/master/install.sql
答案 2 :(得分:-3)
我会让其他人解决您的具体问题,但我会告诉您,IMO,SQL Server 2008中的HierarchyId并不是Microsoft对SQL Server最大的贡献之一。它们很复杂,有点尴尬。我认为你会发现,对于许多层次化需求,常见的表表达式(CTE)工作得很好。
兰迪