在表中,有一个像DepartmentCode和ParentDepartmentCode这样的列,它们是varchar(5)列。DepartmentCode的样本值为1,123,ABC,DEF。
我正在尝试使用上面的方法创建HierarchyId数据类型列。当创建层次结构为/1/123时,很好,但是当创建层次结构为/1/ABC时,它会抛出如下所示的错误。所以我想知道我们不能在HierarchyId中使用字符串数据吗?
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)
.发布于 2017-07-05 23:11:44
文档说:
斜杠启动表示,仅访问根的路径由单个斜杠表示。对于根目录下的级别,每个标签被编码为由点分隔的整数序列。通过比较按字典顺序用点分隔的整数序列,实现了子级的比较。每个级别后面都有一个斜杠。因此,一个斜杠把父母和他们的孩子分开。
所以,你可以拥有像/1/1.2/3.17/这样的东西,但这几乎是它得到的异国情调。
我很幸运的做了一张用斜线分隔的身份证。它还有一个额外的好处,就是自我记录(也就是说,你可以自己重新创建路径)。
https://stackoverflow.com/questions/44929754
复制相似问题