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 69 70 71 72 73 74
|
ALTER FUNCTION GetRecurs (@LinkID BIGINT, @SegmentID BIGINT, @longueur FLOAT)
/* La fonction prend en paramètres :
=> @LinkID & @SegmentID : identifiants du segment dont on veut la descendance
=> @longueur : distance maximale sur laquelle doit s'étendre la liste des segments */
RETURNS @result TABLE (LINK_ID BIGINT, SEG_ID BIGINT, geom GEOGRAPHY, long FLOAT)
/* Dans la table de retour :
=> LINK_ID & SEG_ID : identifiants du segment
=> geom : pour l'affichage du segment
=> long : pour le calcul de la longueur totale */
AS
BEGIN
DECLARE @Lid BIGINT
DECLARE @Sid BIGINT
DECLARE @LidSEG BIGINT
DECLARE @SidSEG BIGINT
DECLARE @row INT
DECLARE @ligne INT
DECLARE @sommeLongueur FLOAT = @longueur
DECLARE @tbl_temp TABLE (i INT identity, LINK_ID BIGINT, SEG_ID BIGINT, geom GEOGRAPHY, long FLOAT)
/* On insère dans la table le segment dont il est question
UNE SEULE LIGNE D'INSEREE */
INSERT INTO @result
SELECT LINK_ID, SEG_ID, geom, LONG
FROM Test.dbo.Segments
WHERE LINK_ID = @LinkID AND SEG_ID = @SegmentID
/* A présent notre table contient les données du segment passé en paramètre.
A ce stade aucun doublon car :
=> Première insertion : table vide
=> Insertion suivante : à partir de la table Temporaire, qui elle n'a pas de doublons
SOURCE D'ERREUR POSSIBLE */
/* On met à jour la longueur des segments déjà comptabilisés
en ajoutant la longueur du segment nouvellement ajouté */
SELECT @sommeLongueur += LONG FROM @result WHERE LINK_ID = @LinkID AND SEG_ID = @SegmentID
/* On insère dans la table temporaire la liste des segments qui suivent ce segment,
si ces segments ne sont pas déjà comptabilisés dans la table result =>
empêche de boucler */
INSERT INTO @tbl_temp
SELECT su.LINK_ID_SEG as LINK_ID, su.SEG_ID_SEG as SEG_ID, se.geom, se.LONG
FROM Test.dbo.Suivants su, Test.dbo.Segments se
WHERE su.LINK_ID = @LinkID AND su.SEG_ID = @SegmentID
AND se.LINK_ID = su.LINK_ID_SEG AND se.SEG_ID = su.SEG_ID_SEG
AND NOT EXISTS (SELECT r.LINK_ID, r.SEG_ID
FROM @result r
WHERE r.LINK_ID = su.LINK_ID_SEG
AND r.SEG_ID = su.SEG_ID_SEG)
/* @row = nombre de ligne dans la table temporaire :
CAD nombre de segments suivants le segment passé en paramètre */
SET @row = @@ROWCOUNT
/* On se base sur la première ligne de notre table temporaire */
SET @ligne = 1
/* Pour chaque élément de la table temporaire,
CAD chaque segment */
WHILE ( @ligne < = @row AND @sommeLongueur < 200 )
BEGIN
/* On récupère les données du segment qui nous intéresse
pour effectuer la récursivité */
SELECT @LID = LINK_ID FROM @tbl_temp WHERE i = @ligne
SELECT @SID = SEG_ID FROM @tbl_temp WHERE i = @ligne
INSERT INTO @result
SELECT * FROM dbo.GetRecurs(@LID, @SID, @sommeLongueur)
SET @ligne = @ligne + 1
END
RETURN
END |
Partager