繁体   English   中英

关于HierarchyId的一些问题(SQL Server 2008)

[英]Some questions about HierarchyId (SQL Server 2008)

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

我正在学习SQL Server 2008 - HIERARCHYID - 第一部分 所以基本上我是逐行跟踪文章,在SSMS中练习时,我发现每个ChildId都生成一些十六进制值,如0x,0x58,0x5AC0等。

我的问题是

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

这些十六进制值只是层次结构级别的二进制表示。 通常,您不应直接使用它们。

您可能想查看以下示例,我认为这应该是不言自明的。 我希望它会让你朝着正确的方向前进。

使用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);

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

我会让其他人解决您的具体问题,但我会告诉您,IMO,SQL Server 2008中的HierarchyId并不是Microsoft对SQL Server最大的贡献之一。 它们很复杂,有点尴尬。 我认为你会发现,对于许多层次结构需求,公共表表达式(CTE)工作得很好。

兰迪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM