11

我是 SQL Server 2008 的新手,刚刚被介绍给 HierarchyId。

我正在学习SQL Server 2008 - HIERARCHYID - PART I。所以基本上我是在逐行阅读文章,在 SSMS 中练习时,我发现对于每个 ChildId,都会生成一些十六进制值,例如 0x、0x58、0x5AC0 等。

我的问题是

  1. 这些十六进制值是什么?
  2. 为什么会生成这些,它们的用途是什么?我的意思是我在哪里可以使用这些六进制值?
  3. 我们对这些六进制值有任何控制权吗?我的意思是我们可以更新等。
  4. 如何通过查看这些六进制值来确定层次结构。我的意思是如何确定哪个是父级,哪个是子级?
4

3 回答 3

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);
于 2009-12-17T21:49:19.863 回答
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

于 2016-04-29T08:46:05.170 回答
-3

我会让其他人解决您的具体问题,但我会告诉您,IMO,SQL Server 2008 中的 HierarchyId 并不是微软对 SQL Server 的最大贡献之一。它们很复杂,而且有些尴尬。我想您会发现,对于许多分层需求,公用表表达式 (CTE) 效果很好。

兰迪

于 2009-12-16T12:36:33.090 回答