In einer Tabelle haben Sie Spalten wie DepartmentCode und ParentDepartmentCode, die Varchar (5) Spalten sind. Die Beispielwerte von DepartmentCode sind wie 1.123, ABC, DEFHierarchyid-Datentyp mit Varchar-Spalte
Ich versuche, HierarchyId Datentypspalte oben zu erstellen. Beim Erstellen einer Hierarchie als/1/123 ist es in Ordnung, aber beim Erstellen einer Hierarchie als/1/ABC wird ein Fehler wie unten angezeigt. Also frage ich mich, können wir nicht String-Daten in HierarchyId verwenden?
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)
.
Haben Sie diesen Link überprüft: https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference ... scheint es zu sein ok mit string aber du musst .ToString() benutzen. – Jesse
Ja, ich habe es überprüft. ToString() -Methode ist, sobald die Hierarchie erstellt wurde, um Hex-Notation in String-Format zu konvertieren. Meine Frage ist die Erstellung der Hierarchie selbst mit String-Daten –
Aus der referenzierten Dokumentation: "Für Ebenen unterhalb der Wurzel ist jedes Etikett als eine Folge von ** Ganzzahlen ** durch Punkte getrennt codiert." Du könntest "ABC" und "DEF" von/in Hexadezimal konvertieren, aber ich habe das Gefühl, dass ein "G" bald genug kommen wird. – HABO