SQL 服务器 - 从 HierarchyId 字段获取第一个节点

SQL Server - Get first node from HierarchyId field

假设我的 SQL 服务器 table 中有以下 HIERARCHYID 列:

MyCol   
/1/1/   
/2/1/   
/3/1/1/ 
/3/1/2/ 
/3/2/1/1/   
/3/2/1/2/   
/4/1/   
/4/2/   
/5/1/   
/6/1/   
/7/1/   
/8/1/   
/8/2/   

并且我想编写一个查询 returns 以下 INT TopNode 列 - 基本上 returning MyCol 列的顶级值:

MyCol       TopNode
/1/1/       1
/2/1/       2
/3/1/1/     3
/3/1/2/     3
/3/2/1/1/   3
/3/2/1/2/   3
/4/1/       4
/4/2/       4
/5/1/       5
/6/1/       6
/7/1/       7
/8/1/       8
/8/2/       8

我对使用 HierarchyId 数据类型还很陌生,在找到 GetDescendantGetLevel 等之间的正确函数以便能够 return 这个整数时遇到问题。

如何以最简单的方式完成此操作?

这应该有效:

SELECT SUBSTRING(YourString, CHARINDEX('/', YourString) + 1, CHARINDEX('/', YourString,CHARINDEX('/', YourString)+1) - (CHARINDEX('/', YourString) + 1))
FROM YourTable;

这对你有用吗?

DECLARE @T TABLE(X HIERARCHYID)
INSERT @T SELECT '/1/1/'   
INSERT @T SELECT '/2/1/'   
INSERT @T SELECT '/3/1/'  
INSERT @T SELECT '/3/2/'   
INSERT @T SELECT '/3/3/'   
INSERT @T SELECT '/3/4/'

SELECT 
    X.GetAncestor(X.GetLevel()-1),
    X.GetAncestor(X.GetLevel()-1).ToString()  
FROM @T

然后您可以通过从简单的替换中强制转换来派生 int -->

TopLevel = CAST(REPLACE(X.GetAncestor(X.GetLevel()-1).ToString(),'/','') AS INT)