2017-07-05 1 views
0

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) 
. 
+0

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

+0

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 –

+0

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

Antwort

0

The documentation sagt:

Ein Schrägstrich beginnt, die Darstellung, und ein Weg, der nur die Wurzel besucht wird durch einen einzelnen Schrägstrich dargestellt. Für Ebenen unterhalb der Wurzel wird jedes Etikett als eine Folge von ganzen Zahlen codiert, die durch Punkte getrennt sind. Ein Vergleich zwischen Kindern wird durchgeführt, indem die ganzzahligen Sequenzen, die durch Punkte getrennt sind, in der Wörterbuchreihenfolge verglichen werden. Auf jede Ebene folgt ein Schrägstrich. Daher trennt ein Schrägstrich Eltern von ihren Kindern.

So können Sie Dinge wie /1/1.2/3.17/ haben, aber das ist etwa so exotisch wie es nur geht.

Ich hatte Glück gehabt, eine durch Schrägstriche getrennte Liste von IDs zu machen. Es hat den zusätzlichen Vorteil, dass es sich selbst dokumentiert (d. H. Sie könnten den Pfad selbst neu erstellen).