SQL, um Heirarchie-String zu erstellen – letzte Ebene fehlt

Ich baue einen String für die Hierarchie eines Dokumentenmanagementsystems. Also, im Grunde der Ordner nach Ordner Zusammenbruch – bis hin zum Dokument.

Zwei Probleme:

1.Die database listet alle Ordner (und ihre Eltern) in einer Tabelle und alle Dokumente in einem anderen (und ihrem übergeordneten Ordner) 2. Die Abfrage, die ich so weit verwende, verpasst die endgültige Ordner-Ebene.

Ich verwende die folgende Abfrage:

select a.id_object, a.name, a.id_parent, b.name as 'parent_name', b.id_parent as 'parent id' into #a FROM [folders] a left join [folders] b on b.id_object = a.id_parent 

dann:

 INSERT INTO Tree2([id_parent],[parent_name],[id_object],[object_name]) select id_parent, [parent_name],id_object, [name] from #a 

dann die absolute obere Ebene zu finden und ein / :

 UPDATE Tree2 SET Lineage='/', Depth=0 WHERE parent_name Is Null UPDATE Tree2 SET Full_Lineage='/', Depth=0 WHERE parent_name Is Null 

Dann das rekursive Teil:

 WHILE EXISTS (SELECT * FROM Tree2 WHERE Depth Is Null) UPDATE T SET T.depth = P.Depth + 1, T.Lineage = P.Lineage + T.id_parent + ' / ' , FROM Tree2 AS T INNER JOIN Tree2 AS P ON (T.id_parent=P.id_object) WHERE P.Depth>=0 AND T.Depth Is Null AND P.Lineage Is Not Null 

Das bringt dann meine data so aus:

 Node id_parent id_object object_name depth lineage 100 f10101 f1010122 blah blah 5 F00/f0/f100/f1000/f10101 

Kann jemand vorschlagen, wie man die endgültige Ordner-Ebene am Ende der Abstammung, wie f1010122 ist der letzte Ordner in der Kette und muss noch in der lineage Spalte enthalten sein? Und dann hatte ich auf eine linke Verknüpfung der Dokumente Tisch, wo document_parent_id = id_object (f1010122) .

Hoffe das macht Sinn. Ich verwende SQL server 2014 Management Studio. Vielen Dank.

Wenn du das aktuelle id_object am Ende seiner Abstammung zurückgeben id_object , dann wäre das ziemlich einfach:

 Select node, id_parent, id_object, object_name, depth, lineage, full_path = lineage + id_object + '/' From Tree2; 

Im Allgemeinen aber könntest du wahrscheinlich erreichen, was du in einem einzigen Schritt willst, anstatt den mehrstufigen process, den du hier hast (was scheint, einige Bugs darin zu haben, vielleicht weil du versucht hast, deinen Code für den Zweck neu zu erstellen um es hier zu posten: Buggy-Samples machen die Antwort härter).

Das folgende Beispiel geht direkt aus der Quell- [folders] -Tabelle und gibt die ausgegebene Ausgabe in einer SELECT statement zurück (die Sie in eine Tabelle insert können, wenn Sie möchten):

 With recursive_cte As ( Select id_object, name, id_parent, depth = 0, lineage = Convert(varchar(128), '/') From [folders] Where id_parent Is Null Union All Select child.id_object, child.name, child.id_parent, depth = parent.depth + 1, lineage = Convert(varchar(128), parent.lineage + child.id_parent + '/') From [folders] As child Join recursive_cte As parent on child.id_parent = parent.id_object) Select id_object, name, id_parent, depth, lineage, full_path = lineage + id_object + '/' From recursive_cte;