Avatar billede orca Nybegynder
05. juni 2003 - 03:24 Der 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.

/Orca
Avatar billede terry Ekspert
05. juni 2003 - 10:11 #1
I may be wrong but I doubt that recursion is possible in SQL server. It isnt a REAL programming tool like VB or Access.
Avatar billede terry Ekspert
05. juni 2003 - 10:12 #2
Wht cant you make your function outside of the dB? Your obvioulsy using the result for something!
Avatar billede terry Ekspert
05. juni 2003 - 10:26 #3
orca, this is taken from Books Online, and if I understand it correctly then your trying to reference the function FROM the function!

"The functions can be referenced only in Transact-SQL statements using the syntax defined in the Transact-SQL Reference."
Avatar billede orca Nybegynder
05. juni 2003 - 13:36 #4
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 :(
Avatar billede orca Nybegynder
05. juni 2003 - 14:21 #5
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.
Avatar billede terry Ekspert
05. juni 2003 - 15:57 #6
well from here  its seem OK !
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester