techIT.ro Do we have a problem? Let's tech it!    












Daca ai impresia ca educatia e scumpa,
atunci încearca sa vezi cum e ignoranta.
Andy McIntyre









Home  |  Dictionar IT  |  Download  |  Forum  |  Despre noi  |  Contact

Funcţii recursive in T-SQL

Pentru a vedea cum se utilizează funcţiile recursive în T-SQL vom lua următorul exemplu:
Tabela care contine un set de date ierarhizate
Acest tabel conţine o ierarhie între elemente de acelasi tip (datele pot fi extrase sub forma unui arbore).

Problema este cum să determinăm care sunt "ramurile" acestui arbore precum şi subramurile acestor ramuri.
Pentru aceasta vom utiliza funţii recursive.
Funcţia recursivă utilizată pentru obţinerea ramurilor (elementelor) subordonate unui element oarecare 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 va utiliza:
SELECT * FROM GetElementChilds (NULL)

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



techit.ro





Colecţia:  Exemple de cod

Articolul precedent:  Exemplu de utilizare a unui trigger în T-SQL
Articolul următor:  Exemplu de utilizare a unei funcţii recursive şi a unui cursor în T-SQL



  


  Adauga un comentariuSpune-ti parerea despre acest articol!