Tout est dans le titre, ce tutoriel utilise pour exemple l'insertion de données dans une table en fonction du résultat d'une requête basée sur sur une table liée
Pour notre exemple prenons une base de données simplifiée contenant 2 tables.
La première : UTILISATEURS (ID_USER, NOM, PW, ETAT) gère les utilisateurs.La seconde GROUPES (ID_USER, NOM_GROUP) gère les groupes assignés aux utilisateurs.
Contenu des tables
Table UTILISATEURS |
ID_USER | NOM | PW | ETAT |
1 | DUBULLOS | xdf5DeP | FATIGUE |
2 | PARABELLUM | FgP45T8 | EN FORME |
3 | PERTEFRAKA | FR8e741 | FATIGUE |
Table GROUPES |
ID_USER | NOM_GROUP |
1 | ADMIN |
1 | CHEF |
2 | CONSEILLER |
2 | CHEF |
3 | POMPIER |
En clair ;-)
- DUBULLOS (ID_USER=1, ETAT=FATIGUE) appartient aux groupes ADMIN et CHEF
- PARABELLUM (ID_USER=2, ETAT= EN FORME) appartient aux groupes CHEF et CONSEILLER
- PERTEFRAKA (ID_USER=3, ETAT=FATIGUE) appartient au groupe POMPIER
Je veux que tous utilisateurs dont l ETAT est
"FATIGUE" appartiennent à un nouveau groupe
"BESOIN_VACANCES". Pour ce faire je vais utiliser un
CURSEUR qui récupérera tous les
ID_USER des utilisateurs (table UTILISATEURS) dont le champ
ETAT =
"FATIGUE" et pour chacun de ces
ID_USER on ajoutera une ligne dans la table GROUPES avec pour NOM_GROUP la valeur
"BESOIN_VACANCES".
DECLARE @CPT_ID as int--variable qui récupérera les CPT_ID DECLARE MyCursor CURSOR --mon curseur
-- Pour tous les CPT_ID de UTILISATEUR qui ont un ETAT= FATIGUE
FOR SELECT ID_USER from UTILISATEURS
WHERE ETAT='FATIGUE'
OPEN MyCursor -- j'initialise mon curseur
-- je le rempli avec mon 1er CP_ID retourné par la requête
FETCH MyCursor INTO @CPT_ID
-- Tant que je n'ai pas traité tous les CPT_ID de le requête
WHILE @@fetch_Status = 0
BEGIN
print @CPT_ID + ' - '
INSERT GROUPES (CPT_ID,NOM_GROUP)
VALUES(@CPT_ID, 'BESOIN_VACANCES')
-- je le rempli avec le CP_ID suivant retourné par la requête
FETCH MyCursor INTO @CPT_ID
END
CLOSE myCursor -- je ferme mon curseur
DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur
Print '----------------- Terminé ------------------------'
Voici le nouveau contenu de la table
GROUPES
Table GROUPES |
ID_USER | NOM_GROUP |
1 | ADMIN |
1 | CHEF |
2 | CONSEILLER |
2 | CHEF |
3 | POMPIER |
1 | BESOIN_VACANCES |
3 | BESOIN_VACANCES |