Skulle behöva ha hjälp med detta träd problem: Hej! Behöver man göra funktionen rekursiv? Tar inte det mer resurser? Vet ej vilket som tar mest resurser. SQL Server är ju varken bra på iteration eller rekursion. Nackdelen med den rekursiva varianten är i och för sig att SQL Server bara klarar 32 stegs rekursion (tror jag). Fastnade väl lite på ordet "rekursiv" i frågan =)Hjälp med rekursion
Har en tabell som har dessa fält -> {ID,ParentID,Namn}
Ex. på innehåll:
1,0,'Root'
2,1,'Alt1'
3,1,'Alt2'
4,2,'Alt1.1'
En trädstruktur alltså!
Skulle vilja ha en rekrsiv fråga som returnerar en tabell som ser ut ex. så här:
'Root\Alt1\Alt1.1'
'Root\Alt2'
Letar alltså upp löven i trädet och tar med sig alla föräldrarna uppåt i hierarkin.Sv: Hjälp med rekursion
Hoppas du har SQL 2000, annars funkar inte lösningen nedan, då den bygger på en rekursiv UDF.
Lösningen här skapar strängar för varje leaf-node.
Skapa följande funktion: (OBS jag har kallat din tabell tbl)
create function rec (@par int)
RETURNS varchar(1000)
AS
begin
declare @str varchar(1000),
@parentid int
select @str=namn, @parentid=parentid
from tbl where id=@par
if @parentid > 0
select @str=dbo.rec(@parentid) + '\' + @str
return @str
end
Sen är det bara att anropa den för varje leaf-node på följande sätt:
select dbo.rec(id)
from tbl
where id not in (select parentid from tbl)
Om du vill ha det i "äkta" tabellform så blir det något struligare, men säg till i så fall så skall jag försöka knåpa ihop något :)Sv: Hjälp med rekursion
KAn inte testa, met typ något sånt här:
<code>
CREATE FUNCTION rec (@par int)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @str varchar(1000)
DECLARE @namn varchar(20) //Skall ha samma storlek som kolumnen
DECLARE @parentid int
DECLARE @flag bit
SELECT @str = namn, @parentid = parentid, @flag = 1
FROM tbl
WHERE id = @par
WHILE @flag = 1
BEGIN
SET @flag = 0
SELECT @str = namn + '\' + @str, @parentid = parentid, @flag = 1
FROM tbl
WHERE id = @parentid
END
RETURN @str
END
</code>Sv: Hjälp med rekursion