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

dee*_*ule 11 t-sql sql-server hierarchyid sql-server-2008

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

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

我的问题是

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

Dan*_*llo 11

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

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

创建一个包含hierarchyid字段的表:

CREATE TABLE groups (
    group_name       nvarchar(100)  NOT NULL,
    group_hierarchy  hierarchyid    NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

插入一些值:

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/'));
Run Code Online (Sandbox Code Playgroud)

查询表格:

SELECT 
    group_name,
    group_hierarchy.ToString()
FROM
    groups
WHERE
    (group_hierarchy.IsDescendantOf(hierarchyid::Parse('/1/')) = 1);
Run Code Online (Sandbox Code Playgroud)


Ran*_*der -3

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

兰迪

  • 我假设您指的是递归 CTE,因为 CTE 一般与层次结构无关。即便如此,这两个概念并不相互排斥,并且 hierarchyid 的性能比我见过的任何其他方法都要好得多(当正确索引和使用时)。Hierarchyid 列还可以与其他嵌套集类型列组合,以执行具有索引查找性能的非常复杂的分层查询。我想说,你的批评是没有根据的;事实上,hierarchyid 是 SQL 2008 中最未被充分利用的数据类型之一。 (6认同)
  • 它不仅没有得到充分利用,而且也没有得到充分支持。LinqtoSQL 或实体框架不支持 HierarchyId(dbml 设计器不会触及它们)。即使在 VS 2010 RC 中也是如此。 (2认同)
  • 对于我们中的一些人来说,HierarchyId 是 SQL 中非常需要的补充。它消除了对许多递归查询的需要,并且在正确使用时可以显着提高性能。 (2认同)