Ich verwende eine Funktion Split (auf social.msdn.com gefunden), und wenn manuell in einem AbfragefensterSQL Split - einfügen in hierarchische Tabellenstruktur
SELECT * FROM dbo.Split('/ABC/DEF/GHI/JKL', '/')
ich folgendes erhalten Ausführung
Id Name
-- ----
1
2 ABC
3 DEF
4 GHI
5 JKL
Dabei ist Id ist nur eine fortlaufende Nummer, die Position innerhalb der ursprünglichen Zeichenfolge angibt und Name ist der Name dieses Knotens. Noch keine hierarchische Information.
Jetzt ist der nächste Schritt, dies in eine hierarchische Datenstruktur in der DB zu setzen. Ich versuche, dies in einem gespeicherten Prozess zu tun und mit meinen SQL-Fähigkeiten, was sie sind, habe ich eine Wand getroffen. Hier ist, was ich würde wie haben: (. FEST, dass die ID-Spalte oben nicht auf die Id oder die ParentId Spalte hier verwendet ist)
Id ParentId Name FullName
-- -------- ---- --------
1 NULL ABC /ABC
2 1 DEF /ABC/DEF
3 2 GHI /ABC/DEF/GHI
4 3 JKL /ABC/DEF/GHI/JKL
ich das habe weit mit meinem SP (GetId mit param @FullName) - GetId sollte die ID zurückgeben, die diesem Knoten zugeordnet ist. Wenn der Knoten nicht existiert, sollte er erstellt werden und die ID aus dieser neuen Zeile sollte zurückgegeben werden. Mit anderen Worten, der Verbraucher dieses SP sollte sich nicht darum kümmern oder wissen, ob der Knoten existiert, bevor er aufgerufen wird:
Die Kategorietabelle (Adjazenzliste), in der diese Elemente schließlich durch eine Reihe von Einfügungen enden, hat die folgende Struktur.
CREATE TABLE Category (
Id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentId int NULL,
Name nvarchar(255) NOT NULL,
FullName nvarchar(255) NOT NULL)
Als Ergebnis, ich will keinen Wert für die Spalte von Id in der Kategorie Tabelle erzeugen und benötigen die entsprechende ParentId für jeden Knoten zu erhalten.
Nachdem die Pfade '/ ABC/DEF/GHI/JKL' und '/ ABC/DEF/XYZ/LMN/OPQ' verarbeitet wurden, und ich habe SELECT a * FROM Kategorie, würde ich erwarten, dass die folgenden sehen:
Id ParentId Name FullName
-- -------- ---- --------
1 NULL ABC /ABC
2 1 DEF /ABC/DEF
3 2 GHI /ABC/DEF/GHI
4 3 JKL /ABC/DEF/GHI
5 2 XYZ /ABC/DEF/XYZ
6 5 LMN /ABC/DEF/XYZ/LMN
7 6 OPQ /ABC/DEF/XYZ/LMN/OPQ
Q: wäre es möglich, ausgehend von der äußersten Knoten rekursiv zurück in die SP zu nennen, bis der Knoten existiert oder wir waren an der Mutter? Etwas in der Art von:
GetId(@FullName)
{
If Category exists with @FullName
return CatId
Else // row doesn't exist for this node
Split @FullName, order by Id DESC so we get the leaf node first
Create Category row
@FullName,
@Name,
@ParentId = Id of next FullName (call GetId with FullName of next row from Split)
}
Mit welcher Version von SQL Server arbeiten Sie? Wenn 2008 Sie [hierarchyid] (http://msdn.microsoft.com/en-us/magazine/cc794278.aspx) berücksichtigt haben? –
Ich bin auf SQL Server 2008 –
Die Art, wie Sie die Pfade bezeichnen, erinnerte mich ziemlich viel an das 'hierarchyid' Format. Ich habe es selbst nicht benutzt, weiß also nicht, ob es für deine Zwecke besser geeignet wäre als das Adjazenzlistenmodell ... –