Du müsstest in der Tabelle eben eine totale Ordnung einführen. Das geht z.B. mit einem hierarchischen Schlüssel. Hier die rekursive Definition:
Code:
Key (Item) = Key(Item.Parent)+ FixedFormat(Item.ID);
Key (Nil)='';
Wichtig ist, das jede Ebene eine feste Stellenanzahl für die Formatierung der eigenen ID bekommt. Dann hätte dein Beispiel (mit einer festen Stellenanzahl von 2) folgende Schlüssel:
Code:
01 Oberkategorie 1 (die ID sei 1)
0101 --K1 (die ID von K1 sei 1)
010101 ----U1
0102 --K2
010201 -----U2
02 Oberkategorie 2
....etc
Du musst in der SP einfach nur die zusätzliche Spalte einfügen und dann diese Spalte entsprechend füllen:
SQL-Code:
CREATE Procedure ListSubTree (@cat_id int)
as
declare @ChildID int
declare @Table Table (
ID INT,
PID INT,
NAME VARCHAR(1000),
uKEY VarChar(80) -- Schlüssel
)
-- 1.Zeile in die Tabelle
insert into @Table
select cat_id, cat_pid, cat_name,
dbo.UDFFixedFormat(cat_id,9) --- Festes 9-stelliges Format (musste selber basteln)
from cate where cat_id = @cat_id
Declare c Cursor local for select ID from @Table
open c
fetch next from c into @ChildID
while @@Fetch_status = 0 begin
-- Mit jedem Schleifendurchlauf werden in einem Abwasch ALLE Kindknoten eingefügt
insert into @Table
select c.cat_id,
c.cat_pid,
c.cat_name,
p.uKEY + dbo.UDFFixedFormat(c.cat_id,9) -- Rekursiv aufgebautes, 3-stelliges Format
from cate c join cate p on c.cat_pid = p.cat_id
where c.cat_pid = @ChildID
fetch next from c into @ChildID
end
close c
deallocate c
select * from @Table order by uKey
GO
Nicht getestet, müsste aber passen.