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 :

Parcourir un SELECT


Sujet :

MS SQL Server

  1. #1
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut Parcourir un SELECT
    Bonjour,

    J'ai le code suivant :
    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 sp_select_usager_for_rel
    (
    @Gerer int
    )
    AS
     
    BEGIN
    SELECT table_usager .code_usager,
    table_usager.volume_prel_forf,
    table_usager.presence_compteur,
    table_type_usager.pu_ht FROM table_usager
    LEFT OUTER JOIN table_type_usager
    ON (table_usager.code_type_usager = table_type_usager.code_type_usager)
    WHERE (table_usager.usager_inactif=@Gerer)
    END
    J'amerais pouvoir parcourir par une instruction WHILE ou FOR
    (juste aprés le WHERE) le jeu d'enregistrement renvoyé par ce SELECT
    afin que je puisse placer pour chaque en enregistrement lu
    un insert dans une autre table. En fait je ne connais pas l'instruction de fin et de deplacement d'enregistrements comme TABLE.EOF et TABLE.Next en delphi.

    Je vous remercie
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    si tu dois placer inconditionnellement toutes les lignes retournées par le select dans une autre table, il vaut mieux utiliser un INSERT/SELECT, cela sera bcp plus performant

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO TABLE (col1, ..., coln)
    SELECT table_usager .code_usager,
    table_usager.volume_prel_forf,
    table_usager.presen....
    Si tu dois tester chaque ligne il faut alors créer un curseur et parcourir le jeu de résultats retourné par le SELECT.
    Emmanuel T.

  3. #3
    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
    Il te faut créer un curseur pour ta requête.

    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
    17
    18
    19
    20
     
    -- Déclaration des variables de réception
    DECLARE @ch1 TYPE
    DECLARE @ch2 TYPE
    -- Déclaration du curseur 
    DECLARE monCurseur CURSOR FOR SELECT ch1,ch2 FROM maTable
    -- Ouverture du curseur 
    OPEN monCurseur
    -- Lecture de la première ligne
    FETCH NEXT FROM monCurseur INTO @ch1,@ch2
    WHILE @@FETCH_STATUS=0
    BEGIN
    /*Traitement SQL*/
    --lecture de la ligne suivante
    FETCH NEXT FROM monCurseur INTO @ch1,@ch2
    END
    -- Fermeture du curseur 
    CLOSE monCurseur 
    --Désallocation mémoire du curseur 
    DEALLOCATE monCurseur
    Voilà qui devrait t'aider.
    Bon courage pour la suite.

  4. #4
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Merci.
    Mais es-qu'il est possible de joindre deux tables ou plus dans le :

    DECLARE monCurseur CURSOR FOR SELECT ch1,ch2 FROM maTable
    Comme ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE monCurseur CURSOR FOR  SELECT table_usager .code_usager,
    table_usager.volume_prel_forf,
    table_usager.presence_compteur,
    table_type_usager.pu_ht FROM table_usager
    LEFT OUTER JOIN table_type_usager
    ON (table_usager.code_type_usager = table_type_usager.code_type_usager)
    WHERE (table_usager.usager_inactif=@Gerer)
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    absolument !
    Emmanuel T.

  6. #6
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Merci beaucoup. Une dernier question... J'ai vu sur certain site qu'on déconseille l'utilisation des curseurs mais je ne sais pas pourquoi parce que c'etait en anglais mais bon...dans mon cas je suis obliger d'y passer par.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  7. #7
    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
    Tout dépend du volume de donner que tu souhaites passer. en effet l'utilisation des curseurs est déconseillé car le résultat de la requête qui charge le curseur est monté en mémoire cache et si le temps de traitement de ta procédure est long alors tu réduis les possibilités pour les autres utilisateurs d'utiliser la mémoire cache du moteur SQL.

    Il faut toujours décharger les curseurs après utilisation avec la fonction DEALLOCATE. Surtout lorsqu'on a des curseurs imbriqués.
    Bon courage pour la suite.

  8. #8
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Merci Madinico ca m'aidera beaucoup.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. macro pour parcourir une selection
    Par lilo2000 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/09/2010, 16h34
  2. Parcourir les éléments d'un div (select, input)
    Par mehdiing dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/07/2009, 19h03
  3. Procédure stockée : parcourir les résultats d'un SELECT
    Par choupeo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 13/12/2007, 18h55
  4. Parcourir un recordset pour un select-Case
    Par Pascal87 dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/09/2007, 21h16
  5. Réponses: 2
    Dernier message: 17/01/2007, 09h01

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