Tsql 如何将新记录插入到具有hierarchyid的表中

Tsql 如何将新记录插入到具有hierarchyid的表中,tsql,hierarchyid,Tsql,Hierarchyid,我正在学习如何使用hierarchyid处理分层数据。我读过一篇教程。演示数据由预先计算的层次结构组成。我熟悉在主键中使用标识(1,1)的父/子表。我明白我必须提供等级的价值。但我不知道该怎么做。对于没有父项的新记录和具有父项的新记录(假设我具有父项的hierarchyid),如何获取hierarchyid的值?非常感谢。正如Microsoft所说:“由应用程序生成和分配HierarchyId值,以使行之间所需的关系反映在值中。” HierarchyId总是有一个父级,顶部分支有一个根作为父级

我正在学习如何使用hierarchyid处理分层数据。我读过一篇教程。演示数据由预先计算的层次结构组成。我熟悉在主键中使用标识(1,1)的父/子表。我明白我必须提供等级的价值。但我不知道该怎么做。对于没有父项的新记录和具有父项的新记录(假设我具有父项的hierarchyid),如何获取hierarchyid的值?非常感谢。

正如Microsoft所说:“由应用程序生成和分配HierarchyId值,以使行之间所需的关系反映在值中。”

HierarchyId总是有一个父级,顶部分支有一个根作为父级

以下是一些例子:

因此,要为新记录生成一个新的HierarchyId,您必须获取一个父(或根),使用
getgenerat
函数并指示要在哪个子级之后或两个子级之间添加它

declare @Parent hierarchyid = 0x; -- root
    
print @Parent.GetDescendant('/1/', '/2/').ToString()     -- /1.1/
print @Parent.GetDescendant('/1/', '/1.1/').ToString()   -- /1.0/
print @Parent.GetDescendant('/1/', '/1.0/').ToString()   -- /1.-1/
print @Parent.GetDescendant('/1/', '/1.-1/').ToString()  -- /1.-2/
    
print @Parent.GetDescendant('/1.1/', '/2/').ToString()   -- /1.2/
print @Parent.GetDescendant('/1.2/', '/2/').ToString()   -- /1.3/
print @Parent.GetDescendant('/1.3/', '/2/').ToString()   -- /1.4/
    
print @Parent.GetDescendant('/1.3/', '/1.4/').ToString() -- /1.3.1/
    
print @Parent.GetDescendant('/1.2.3.4.5.6.7.8/', '/1.2.3.4.5.6.7.9/').ToString() -- /1.2.3.4.5.6.7.8.1/
    
    
-- by the way
    
declare @Hid hierarchyid = '/1.2.3.4.5.6.7.8.1/';
select @Hid; -- 0x63A08A49A85258
    
declare @Hid hierarchyid = '/-1.-2.-3.-4.-5.-6.-7.-8.-1234567890/';
select @Hid; -- 0x41F8F87A3C1D8E87216D9A81A73A
    
    
    -- special cases with null
    
print @Parent.GetDescendant(null, null).ToString()    -- /1/
print @Parent.GetDescendant('/1/', null).ToString()   -- /2/
print @Parent.GetDescendant(null, '/1/').ToString()   -- /0/