Ausgehend von
diesem Thread, hier mal die Version für
MsSQL...
Folgende Tabelle habe ich für den Baum angelegt...
SQL-Code:
CREATE TABLE [nodes] (
[id] [int] NOT NULL ,
[parentid] [int] NULL ,
[Bezeichnung] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[Reihenfolge] [int] NOT NULL ,
CONSTRAINT [PK_nodes] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
Beispielinhalt...
SQL-Code:
+----+----------+-----+-------------+
| id | parentid | bez | reihenfolge |
+----+----------+-----+-------------+
| 1 | NULL | A | 1 |
| 2 | 1 | AA | 1 |
| 3 | 1 | AB | 2 |
| 4 | NULL | B | 2 |
| 5 | 4 | BA | 1 |
| 6 | 4 | BB | 2 |
| 7 | 1 | AC | 3 |
| 8 | 7 | ACA | 1 |
+----+----------+-----+-------------+
Dann habe ich folgende Prozedur angelegt...
SQL-Code:
CREATE PROCEDURE proc_node (@ParentID INT, @NurBlaetter BIT) AS
DECLARE @id INT
DECLARE @bezeichnung VARCHAR(1000)
DECLARE cursor_nodes CURSOR LOCAL FOR
SELECT id, bezeichnung
FROM nodes
WHERE COALESCE(parentid, 0) = @ParentID
ORDER BY reihenfolge
OPEN cursor_nodes
FETCH NEXT FROM cursor_nodes INTO @id, @bezeichnung
WHILE @@FETCH_STATUS = 0 BEGIN
IF (SELECT COUNT(*) FROM nodes WHERE parentid = @id) = 0
OR @NurBlaetter = 0
BEGIN
INSERT INTO ##temp (ID, Bezeichnung) VALUES (@id, @bezeichnung)
END
EXEC proc_node @id, @NurBlaetter
FETCH NEXT FROM cursor_nodes INTO @id, @bezeichnung
END
CLOSE cursor_nodes
DEALLOCATE cursor_nodes
und dann diese Prozedur...
SQL-Code:
CREATE PROCEDURE proc_main (@ParentID INT, @NurBlaetter BIT) AS
CREATE TABLE ##temp (
ID INT,
Bezeichnung VARCHAR(1000)
)
EXEC proc_node @ParentID, @NurBlaetter
SELECT *
FROM ##temp
DROP TABLE ##temp
Ausgabe des gesamten Baums...
SQL-Code:
EXEC proc_main 0, 0
+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 1 | A |
| 2 | AA |
| 3 | AB |
| 7 | AC |
| 8 | ACA |
| 4 | B |
| 5 | BA |
| 6 | BB |
+------+-------------+
Ausgabe aller Elemente und Unterelemente, die zum Element mit der ID = 1 gehören...
SQL-Code:
EXEC proc_main 1, 0
+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 2 | AA |
| 3 | AB |
| 7 | AC |
| 8 | ACA |
+------+-------------+
Ausgabe des gesamten Baums (nur die Blätter)...
SQL-Code:
EXEC proc_main 0, 1
+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 2 | AA |
| 3 | AB |
| 8 | ACA |
| 5 | BA |
| 6 | BB |
+------+-------------+
Ausgabe aller Blatt-Elemente, die zum Element mit der ID = 1 gehören...
SQL-Code:
EXEC proc_main 1, 1
+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 2 | AA |
| 3 | AB |
| 8 | ACA |
+------+-------------+
Lieder ist die maximale Rekursionstiefe bei
MsSQL 32, tiefere Baumstrukturen sind dadurch leider nicht möglich. (Bei
MySQL kann bzw. muss man diesen Wert manuell setzen)
Gruss
Thorsten
[edit=CalganX]Titel und Klassifizierung angepasst. Mfg, CalganX[/edit]