Bonjour, j'ai une base de données que je souhaiterais dédoublonner sur l'adresse Email.
Pour celà je suis en train de construire une procédure stockée pour garder, de toutes les lignes qui possèdent la même adresse mail, la dernière. J'imagine ( si vous avez de meilleures idées n'hésitez pas ) utiliser deux curseurs sur l'adresse mail.
Pour chaque adresse prise par le premier, le second va donc parcourir la table, si une correspondance est trouvée, la ligne du premier est supprimée et on recommence.
trois questions : comment supprimer la ligne courante d'un curseur, et puis-je faire dans la procédure un order by Email pour que la procédure soit plus rapide ? Il faudrait que le second curseur démarre à la ligne directement après la ligne courante du premier, comment faire ?
edit : en fait en écrivant celà je réalise que je peux faire pour le second curseur un select * where Email=valeur du premier... mais alors comment supprimer toutes les lignes de ce résultat sauf la dernière ?
edit2 : voilà à quoi ca pourrait ressembler ( avec un seul curseur ?)
est ce que celà serait correct ? ( outre le fait que sqlserver me signale une erreur "vers le mot clé where" que je ne trouve pas )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 CREATE PROCEDURE dedoub AS DECLARE @mailRef VARCHAR(64) DECLARE @compte INT DECLARE curseur CURSOR for SELECT * FROM ( SELECT count(*) as Expr1, Email from Adresses group by Email ) where Expr1 >1 OPEN curseur FETCH curseur into @compte, @mailRef WHILE @@FETCH_STATUS=0 BEGIN DELETE TOP (@compte - 1) from Adresses where Email=@mailRef FETCH curseur into @compte, @mailRef END CLOSE curseur DEALLOCATE curseur
Partager