IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Equivalent for each row


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Equivalent for each row
    Bonjour,
    suite à mon post d'hier sans réponse,
    je pense avoir isolé mon probleme,

    mon trigger ne se déclenche qu'une seule fois
    comment le faire pour chaque ligne comme le each row de pl sql ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Bonjour,

    Pour répondre à ta question, l'équivalent SQL Server est le curseur. Il se déclare de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE monCurseur CURSOR FOR SELECT .... FROM ... WHERE ...
    OPEN monCurseur 
    FETCH NEXT FROM monCurseur  INTO ...
    WHILE @@FETCH_STATUS=0
    BEGIN
    ...
    FETCH NEXT FROM monCurseur  INTO ...
    END
    CLOSE monCurseur  
    DEALLOCATE monCurseur
    L'utilisation de curseur est fortement déconseillé car il utilise la mémoire cache efin de remonter le résultat des requêtes. Je pense qu'une bonne analyse de ton besoin pourrait te permettre d'effectuer des requêtes ensemblistes qui sont bien plus efficace.

    Je vais rechercher ton précédent POST afin d'y répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Merci
    merci, de la réponse,
    je suis étonne que cette fonction n'existe pas à vrai dire mais bon,
    un curseur n'est pas envisageable dans mon cas je pense, car je dois charger des fichiers de quelques milliers de lignes, et j'ai bien peur que mon temps de traitement ne soit trop long.

    Pour faire simple,
    je passai par une table temporaire pour stocker mes info,
    j'insere ou update mon client selon le cas et recupere son id (auto incrementé)
    pour remplir son adresse associé dans la table adresse par exemple.

    Du coup, je ne vois pas trop comment faire, l'id etait pratique et rapide.
    je vais essayer d'utiliser SSIS...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 009
    Points
    53 009
    Billets dans le blog
    6
    Par défaut
    importez vos données dans une table tampon et faites deux requêtes ensemblistes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO matable
    SELECT MaTabletampon
    EXCEPT 
    SELECT... FROM MaTable
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE Matable
    SET ...
    FROM Matable
    INTERSECT
    SELECT ...
    FROM MaTableTampon
    A +

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par killerti Voir le message
    mon trigger ne se déclenche qu'une seule fois
    En MS SQL, le trigger réagit sur l'ordre (UPDATE, DELTE ou INSERT) et non sur le nombre de lignes concernées.

    Si l'instruction UPDATE concerne 1 seule ligne, le trigger réagit 1 seule fois (la table INSERTED contiendra 1 ligne). Si par contre, l'ordre UPDATE concerne n lignes, le trigger ne réagit qu'une seule fois (car une seule instruction UPDATE) et la table INSERTED contiendra n lignes.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Points : 357
    Points
    357
    Par défaut
    Conclusion : en combinant cette information

    En MS SQL, le trigger réagit sur l'ordre (UPDATE, DELTE ou INSERT) et non sur le nombre de lignes concernées.

    Si l'instruction UPDATE concerne 1 seule ligne, le trigger réagit 1 seule fois (la table INSERTED contiendra 1 ligne). Si par contre, l'ordre UPDATE concerne n lignes, le trigger ne réagit qu'une seule fois (car une seule instruction UPDATE) et la table INSERTED contiendra n lignes.

    + la requête de SQLPro tu devrais pouvoir faire ce dont tu as besoin

Discussions similaires

  1. Trigger / for each row
    Par liseprachan dans le forum Développement
    Réponses: 9
    Dernier message: 04/11/2013, 12h10
  2. [FOR EACH ROW] Comment le remplacer
    Par O Oøps O dans le forum SQL
    Réponses: 5
    Dernier message: 23/04/2009, 22h36
  3. Trigger statement ou for each row
    Par maserati dans le forum Débuter
    Réponses: 1
    Dernier message: 10/02/2009, 23h53
  4. [LG] Equivalence de 'For Each' en Pascal
    Par jerome.mace dans le forum Langage
    Réponses: 1
    Dernier message: 22/07/2005, 22h54
  5. Annuler seulement certaines actions d'1 trigger for each row
    Par thebloodyman dans le forum Oracle
    Réponses: 8
    Dernier message: 28/02/2005, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo