首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Varchar列的Hierarchyid数据类型

使用Varchar列的Hierarchyid数据类型
EN

Stack Overflow用户
提问于 2017-07-05 14:58:30
回答 1查看 1.3K关注 0票数 0

在表中,有一个像DepartmentCode和ParentDepartmentCode这样的列,它们是varchar(5)列。DepartmentCode的样本值为1,123,ABC,DEF。

我正在尝试使用上面的方法创建HierarchyId数据类型列。当创建层次结构为/1/123时,很好,但是当创建层次结构为/1/ABC时,它会抛出如下所示的错误。所以我想知道我们不能在HierarchyId中使用字符串数据吗?

代码语言:javascript
复制
CREATE TABLE [dbo].[Test_Department](
[GLDHierarchyID] hierarchyid NOT NULL
)
insert into Test_Department([GLDHierarchyID]) select hierarchyid::GetRoot();
insert into Test_Department([GLDHierarchyID]) select hierarchyid::Parse('/'+ 
cast(1 as varchar(4))+'/');
select [GLDHierarchyID].ToString() from [Test_Department]

--This works good
Declare @testData varchar(3)='123'
Declare @hiearchy hierarchyid 
SELECT @hiearchy=[GLDHierarchyID] FROM [Test_Department] where 
[GLDHierarchyID].GetLevel()=1
INSERT INTO Test_Department([GLDHierarchyID]) 
SELECT  
Case when try_parse(@testData as int)>0 then 
hierarchyid::Parse(@hiearchy.ToString()  + cast(cast(@testData as int) as 
varchar(5))+'/')
else hierarchyid::Parse(@hiearchy.ToString() + cast(@testData as varchar(5)) 
+'/')
end as GLDHierarchyID
--select [GLDHierarchyID].ToString() from [Test_Department]

--This does not work
Declare @testData varchar(3)='ABC'
Declare @hiearchy hierarchyid 
SELECT @hiearchy=[GLDHierarchyID] FROM [Test_Department] where 
[GLDHierarchyID].GetLevel()=1
INSERT INTO Test_Department([GLDHierarchyID]) 
SELECT  
Case when try_parse(@testData as int)>0 then 
hierarchyid::Parse(@hiearchy.ToString()  + cast(cast(@testData as int) as 
varchar(5))+'/')
else hierarchyid::Parse(@hiearchy.ToString() + cast(@testData as varchar(5)) 
+'/')
end as GLDHierarchyID
--select [GLDHierarchyID].ToString() from [Test_Department]





Msg 6522, Level 16, State 2, Line 1
A .NET Framework error occurred during execution of user-defined routine or 
aggregate "hierarchyid": 
Microsoft.SqlServer.Types.HierarchyIdException: 24001: SqlHierarchyId.Parse 
failed because the input string '/1/ABC/' is not a valid string 
representation of a SqlHierarchyId node.
Microsoft.SqlServer.Types.HierarchyIdException: 
at Microsoft.SqlServer.Types.OrdPath.InitFromString(String chDottedString)
at Microsoft.SqlServer.Types.SqlHierarchyId.Parse(SqlString input)
.
EN

回答 1

Stack Overflow用户

发布于 2017-07-05 23:11:44

文档说:

斜杠启动表示,仅访问根的路径由单个斜杠表示。对于根目录下的级别,每个标签被编码为由点分隔的整数序列。通过比较按字典顺序用点分隔的整数序列,实现了子级的比较。每个级别后面都有一个斜杠。因此,一个斜杠把父母和他们的孩子分开。

所以,你可以拥有像/1/1.2/3.17/这样的东西,但这几乎是它得到的异国情调。

我很幸运的做了一张用斜线分隔的身份证。它还有一个额外的好处,就是自我记录(也就是说,你可以自己重新创建路径)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44929754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档