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 :

Parcours d'un curseur incohérent


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 14
    Par défaut Parcours d'un curseur incohérent
    Salut !

    Je déroule un curseur dans une procédure stockée mais tous mes éléments ne sont pas traités bien que je passe le bon nombre de fois dans la boucle :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    CREATE PROCEDURE _FF_CTA_ctrl_Abonnements
    AS
    	SET NOCOUNT ON
    
    	DECLARE @cabonnement CHAR(8)
    	DECLARE @nb_abonnements INT
    
    	DECLARE curs_abo_à_contrôler INSENSITIVE CURSOR FOR SELECT CAbonnement FROM CTA_Abonnement WHERE NAnomalies IS NULL
    
    	OPEN curs_abo_à_contrôler
    	SELECT @nb_abonnements = @@CURSOR_ROWS
    
    	FETCH NEXT FROM curs_abo_à_contrôler INTO @cabonnement
    
    	DECLARE @dcréation SMALLDATETIME
    	DECLARE @drésiliation SMALLDATETIME
    	DECLARE @ctarif CHAR(6)
    	DECLARE @nabopere CHAR(8)
    	DECLARE @cli CHAR(9)
    	DECLARE @pconsommation SMALLDATETIME
    
    	DECLARE @ok BIT
    
    	SELECT @ok = 0
    
    	DECLARE @erreur INT,@nombre INT
    
    	DECLARE @dfin SMALLDATETIME
    
    	SELECT @dfin = Fin FROM CTA_Période
    
    	DECLARE @nb_passes INT
    
    	SELECT @nb_passes = 0
    
    	WHILE (@@FETCH_STATUS = 0)
    	BEGIN
    		SELECT
    			@dcréation = DCréation
    			,@drésiliation = DRésiliation
    			,@ctarif = CTarif
    			,@nabopere = NAboPere
    			,@cli = CLI
    			,@pconsommation = PConsommation
    		FROM CTA_Abonnement_Détails
    		WHERE CAbonnement = @cabonnement
    
    		IF @dcréation >= @drésiliation
    		BEGIN
    			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'DCR'
    			SELECT @ok = 1
    			SELECT @nb_abonnements = @nb_abonnements-1
    		END
    
    		IF LEFT(RTRIM(LTRIM(@ctarif)),3) = 'COR'
    		BEGIN
    			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'COR'
    			SELECT @ok = 1
    			SELECT @nb_abonnements = @nb_abonnements-1
    		END
    
    		IF LEN(RTRIM(LTRIM(@nabopere))) > 0 AND LEN(RTRIM(LTRIM(@cli))) = 0
    		BEGIN
    			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'CLI'
    			SELECT @ok = 1
    			SELECT @nb_abonnements = @nb_abonnements-1
    		END
    
    		IF @pconsommation IS NULL OR @pconsommation > @dfin
    		BEGIN
    			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'PCO'
    			SELECT @ok = 1
    			SELECT @nb_abonnements = @nb_abonnements-1
    		END
    
    		IF @ok = 0
    		BEGIN
    			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'AOK'
    			SELECT @nb_abonnements = @nb_abonnements-1
    		END
    
    		SELECT @nb_passes = @nb_passes+1
    
    		FETCH NEXT FROM curs_abo_à_contrôler INTO @cabonnement
    	END
    
    	PRINT 'Nb non traités : ' + CAST(@nb_abonnements AS VARCHAR(20))
    	PRINT 'Nb passes : ' + CAST(@nb_passes AS VARCHAR(20))
    
    	CLOSE curs_abo_à_contrôler
    	DEALLOCATE curs_abo_à_contrôler
    GO
    La sous-procédure utilisé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
    CREATE PROCEDURE _FF_CTA_set_Anomalie
    	@cabonnement CHAR(8),@canomalie CHAR(3)
    AS
    	SET NOCOUNT ON
     
    	DECLARE @abonnement_id INT,@anomalie_id INT
     
    	IF @canomalie = 'AOK'
    		UPDATE CTA_Abonnement SET NAnomalies = 0 WHERE CAbonnement = @cabonnement
    	ELSE
    	BEGIN
    		SELECT @abonnement_id = Identifiant FROM CTA_Abonnement WHERE CAbonnement = @cabonnement
     
    		SELECT @anomalie_id = Identifiant FROM CTA_Anomalie WHERE CAnomalie = @canomalie
     
    		INSERT INTO CTA_Abonnement_Anomalie (Abonnement,Anomalie) VALUES (@abonnement_id,@anomalie_id)
     
    		UPDATE CTA_Abonnement SET NAnomalies = ISNULL(NAnomalies,0) + 1 WHERE CAbonnement = @cabonnement
    	END
    GO
    Cela me donne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nb non traités : 23405
    Nb passes : 29368
    Je sèche, quelqu'un a une idée ? Je dois passer à côté de quelque chose mais je vois pas quoi ...

  2. #2
    Membre Expert
    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
    Par défaut
    bonjour,

    il se peut que vos IF ne soient pas exhaustifs par rapport aux cas possibles ?

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Vous faites des mise à jour sur les mêmes lignes que celles du curseur. Cela déplace donc les lignes...

    Vous devriez éviter les curseur. En SQL Server 2005, le niveau de SQL est si complet qu'en principe toutes les requêtes peuvent s'écrire sans !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 02/04/2010, 11h10
  2. PL/SQL Parcours Colonnes Curseur
    Par PoPmiSiR dans le forum Oracle
    Réponses: 2
    Dernier message: 23/11/2009, 18h17
  3. Parcours d'un curseur
    Par Fatah93 dans le forum Oracle
    Réponses: 3
    Dernier message: 27/01/2007, 16h28
  4. [ SQL - proc stockée ] optimisation du code parcours curseur
    Par luimême dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/10/2005, 16h20
  5. [PL/SQL] parcours de curseur
    Par NPortmann dans le forum Oracle
    Réponses: 20
    Dernier message: 20/05/2005, 21h51

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