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

Développement SQL Server Discussion :

remplacer la clause UPDATE dans un curseur


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 4
    Points : 6
    Points
    6
    Par défaut remplacer la clause UPDATE dans un curseur
    Bonjour à tous,

    j'ai une procédure stockée dans laquelle j'utilise un curseur. Dans la déclaration du curseur, j'utilise une clause UPDATE. Cela a pour conséquence un temps d'exécution énorme. j'ai vu dans la littérature qu'utiliser une clause UPDATE dans un curseur n'était pas conseillé. Je sollicite donc votre coup de pouce à cet effet.

    ci-dessous la procédure stockée:

    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
    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
    CREATE PROCEDURE calcule_ieme_tous3
     
    AS
     
    BEGIN
     
    declare @counter int
    declare @cli int
    declare @max int
     
    declare curs cursor
    for select  distinct cli from tr_cli_qrt2
        order by cli
     
     
    open curs
     
    fetch next from curs into @cli
     
    while @@fetch_status = 0
    begin
     
    set @max=(select Max(ieme) from tr_cli_qrt
    where cli=@cli)
    if (@max=null)
    set @max='0'
    set @counter=@max
     
     
     
     
        update  tr_cli_qrt 
    	set @counter = ieme = @counter + 1
          where cli= @cli 
     
     
        fetch next from curs into @cli
    set @max=@counter
    end
     
    close curs
    deallocate curs
     
     
    END
     
    GO


    le résultat obtenu est le suivant


    cli post_quart expl ieme BP
    539901 A1 840 1 00005
    539902 A2 840 1 00001
    539904 A3 840 1 00001
    539904 A4 840 2 00001
    539905 A5 840 1 00198
    539906 A6 840 1 00464
    539907 A7 840 1 00455
    539909 A8 840 1 00198
    539909 A9 840 2 00198
    539909 A9 840 3 00197
    539911 A10 840 1 00489

    avec la table tr_cli_qrt telle que:
    ->cli int
    ->post_quart char(2)
    -> expl char(3)
    ->ieme int (la colonne du calcul. elle a pour valeur 0 avant le traitement)
    -> BP char(5)


    Merci d'avance!
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    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 922
    Points : 51 717
    Points
    51 717
    Billets dans le blog
    6
    Par défaut
    Merci d'indenter votre texte avec le balise code (#).

    A +

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    'ai vu dans la littérature qu'utiliser une clause UPDATE dans un curseur n'était pas conseillé
    En fait ce sont les curseurs en tant que tel qui sont déconseillés : ils sont itératifs, alors que SQL est ensembliste, donc par nature contre-performants.

    Il est possible qu'il vous manque un index sur la table dbo.tr_cli_qrt, mais avant cela il faudra réécrire la procédure stockée de façon ensembliste. Pour le moment je n'y parviens pas parce que je ne comprend pas bien ce que vous voulez faire. Pouvez-vous donner plus de détails ?

    @++

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,


    En fait ce sont les curseurs en tant que tel qui sont déconseillés : ils sont itératifs, alors que SQL est ensembliste, donc par nature contre-performants.

    Il est possible qu'il vous manque un index sur la table dbo.tr_cli_qrt, mais avant cela il faudra réécrire la procédure stockée de façon ensembliste. Pour le moment je n'y parviens pas parce que je ne comprend pas bien ce que vous voulez faire. Pouvez-vous donner plus de détails ?

    @++

    en fait si par exemple j'ai une valeur de cli égale par exemple à 5560 sur 5 ligne et une autre valeur de cli sur deux ligne égale à 5561 le resultat sera le suivant :
    cli ieme
    5560 1
    5560 2
    5560 3
    5560 4
    5560 5
    5561 1
    5561 2

    il faut incrémenter la valeur de ieme pour une même valeur de cli, puis recommencer avec à la prochaine valeur de cli (différente de la valeur précédente)

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    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 922
    Points : 51 717
    Points
    51 717
    Billets dans le blog
    6
    Par défaut
    Dans ce cas la fonction ROW_NUMBER le fait d'un seul coup...

    Donnez-nous le DDL de vos tables pour que l'on puise vous donner l'UPDATE final.

    A +

Discussions similaires

  1. clause LIMIT dans une requête UPDATE
    Par Dominique49 dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/12/2011, 12h06
  2. [ZF 1.10] 2 clauses Where dans un Update
    Par tomtom94500 dans le forum Zend Framework
    Réponses: 1
    Dernier message: 05/07/2010, 12h47
  3. la clause group by dans un curseur explicite
    Par lucaazori1988 dans le forum Oracle
    Réponses: 5
    Dernier message: 29/04/2010, 11h36
  4. Réponses: 7
    Dernier message: 06/09/2006, 16h18
  5. Clause count dans un update
    Par franklin_007 dans le forum Access
    Réponses: 1
    Dernier message: 13/09/2005, 16h40

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