| [Home] | Funcţii recursive in T-SQL | ||

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!