[Home] Funcţii recursive in T-SQL


Pentru a vedea cum se utilizează funcţiile recursive în T-SQL să luăm următorul exemplu:

Acest tabel defineste o ierarhie între elemente de acelasi tip.

Se poate observa că tabela "Hierarchy" descrie un arbore.
Problema este cum să determinăm care sunt "ramurile" acestui arbore precum si subramurile acestor ramuri.
Pentru aceasta vom utiliza funţii recursive.
Funcţia recursivă utilizată pentru obţinerea ramurilor (elementelor) subordonate unui element este:

CREATE FUNCTION GetElementChilds ( @ElementID INT)
RETURNS @result TABLE ( [ID] INT , ElementName CHAR ( 50 ) , SuperiorElementID INT)
AS

BEGIN

DECLARE
@r INT
DECLARE @i INT
DECLARE @id INT
DECLARE @tbl_temp TABLE ( i INT identity, [ID] INT , ElementName CHAR ( 50 ) , SuperiorElementID INT )

SET @i = 1

INSERT INTO @tbl_temp
SELECT [ID], ElementName, SuperiorElementID
FROM Hierarchy

SET @r = @@ROWCOUNT

WHILE ( @i < = @r )
BEGIN
  SELECT @id = [ID] FROM @tbl_temp WHERE i = @i

  INSERT INTO @result
  SELECT [ID], ElementName, SuperiorElementID
  FROM @tbl_temp
  WHERE [ID] = @id AND SuperiorElementID = @ElementID

  IF @@ROWCOUNT > 0
  BEGIN
   INSERT INTO
@result
   SELECT * FROM GetElementChilds ( @id )
  END

  SET
@i = @i + 1
END

RETURN
END


Utilizare:

SELECT * FROM GetElementChilds ( 1 )

ID ElementName SuperiorElementID
2 Level 2 - Element 2.1 (child of 1) 1
5 Level 3 - Element 3.1 (child of 2) 2
6 Level 3 - Element 3.2 (child of 2) 2
7 Level 3 - Element 3.3 (child of 2) 2
3 Level 2 - Element 2.2 (child of 1) 1
8 Level 3 - Element 3.4 (child of 3) 3
4 Level 2 - Element 2.3 (child of 1) 1


Pentru a vedea toate ramurile arborelui se utilizează:
SELECT * FROM GetElementChilds (NULL)

Notă importantă: numărul maxim de recurenţe permise este de 32!