05. juni 2003 - 03:24Der er
5 kommentarer og 1 løsning
Rekursiv funktion
Hejsa.
Jeg er ved at lave en funktion i min MsSQL database som skal bruges til at lave stier.
Jeg har en tabel som i hovedtræk er bygget op således:
GroupID ParentID Name
Hvad jeg har brug for er en funktion som tager tre parametre: @intGroupID int, @strDelimiter varchar(2), @strPath varchar(2000)
Først skal jeg vide om det aktuelle gruppe har parentid 0, hvis den har det skal jeg have returneret @strPath + RETURN @strDelimiter + (SELECT [Name] FROM [xxx] WHERE [GroupID] = @intGroupID)
Hvis ikke ParentID er = 0, så skal funktionen kalde sig selv igen: RETURN minFunktion((SELECT [ParentID] FROM [xxx] WHERE [GroupID] = @intGroupID), @strDelimiter, @strPath + @strDelimiter + (SELECT [Name] FROM [xxx] WHERE [GroupID] = @intGroupID))
Problemet er at den brokker sig når jeg kalder funktionen rekursivt, den siger at funktionen ikke eksisterer?
Jeg håber jeg har forklaret grundigt nok hvordan funktionen bør virke, jeg mangler et kodeeksempel på hvordan man kan lave sådan en rekursiv funktion.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Hi terry, thanks for the answer. You're right, i was trying to reference the function within the function itself. I want to put as much DB code inside the database itself, so that my webcode will be easier to read and work with. But i suppose i have to do this outside the database then :(
Could you possible help me location the error in this non-recursive function i've made?
CREATE FUNCTION FileGroupPath ( @intGroupID int ) RETURNS varchar(2000) AS BEGIN
DECLARE @intParentID int DECLARE @strPath varchar(2000) DECLARE @strDelimiter varchar(1) SET @intParentID = @intGroupID SET @strDelimiter = '/'
WHILE @intParentID<>0 BEGIN SELECT @strPath = @strPath + @strDelimiter + (SELECT [Name] FROM [tblFileGroups] WHERE [GroupID] = @intParentID) SELECT @intParentID = (SELECT [ParentID] FROM [tblFileGroups] WHERE [GroupID] = @intParentID) END
RETURN @strPath
END
I syntax checks ok, and it runs, but it doesn't return anything. I've checked, it does run the two lines in the while loop, but still it doesn't return anything.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.