1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
ALTER PROCEDURE SP_R
(
@Parent int
)
AS
/* Procédure récursive
Creation de #TMP_R Table temporaire de récursion contenant les codes de la descendance
*/
declare @Code int
declare @lvl int
if @@NESTLEVEL=1
BEGIN
CREATE TABLE #TMP_R (
Code int,
Niv int
)
-- On enregistre le 1er code dans la table temporaire
INSERT INTO #TMP_R (Code,Niv) VALUES (@ParentMenu,0)
END
PRINT @ParentMenu
DECLARE C CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT Code
FROM T1
WHERE FK_T1_Code = @ParentMenu
OPEN C
FETCH NEXT FROM C INTO
@Code
WHILE @@FETCH_STATUS = 0
BEGIN
-- On enregistre les code des descendants dans la table temporaire
INSERT INTO #TMP_R
(Code,Niv)
VALUES
(@Code,@@NESTLEVEL)
exec SP_R @Code
FETCH NEXT FROM C INTO
@Code
END
CLOSE C
DEALLOCATE C
if @@NESTLEVEL=1
BEGIN
-- On est ici après être remonté de la récursion
-- Tres important je trie par niveau à l'envers pour ne pas obtenir d'erreur de violation d'intégrité
DECLARE C CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT Code,Niv FROM #TMP_R ORDER BY Niv DESC
OPEN C
FETCH NEXT FROM C INTO
@Code,@lvl
WHILE @@FETCH_STATUS = 0
BEGIN
--Je supprime d'abord les éléments de la jointure
DELETE FROM J1 WHERE FK_T1_Code = @Code
--Je supprime ensuite le decendant qui à ce stade n'a plus de décendant
DELETE FROM T1 WHERE Code = @Code
FETCH NEXT FROM C INTO
@Code,@lvl
END
CLOSE C
DEALLOCATE C
--Je détruis la table temporaire de récursion
DROP TABLE #TMP_R
END
RETURN |
Partager