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

Langage SQL Discussion :

Mise a jour de table avec curseur


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut Mise a jour de table avec curseur
    Bonjour aux pro de SQL,

    Je suis entrains de faire une mise à jour de table avec un curseur, mais je remarque que

    dans ma table mise à jour j'ai des valeurs existant qui sont encore insérées. ma condition est que que si
    l'association comptebancairecode et comptebancairesousrole n'existe pas dans la table transco alors
    insert une ligne dans la table transco avec une valeur constante codedom avec l'association comptebancairecode et comptebancairesousrole
    j'ai besoin de votre aide

    mon code est le 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
    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
    DECLARE @temp		VARCHAR(255)
    DECLARE @codeBMDM	VARCHAR(255)
    DECLARE @sousrole	VARCHAR(255)
    DECLARE @association  VARCHAR(255)
     
     
     
    DECLARE curs_sansDEF CURSOR FAST_FORWARD FOR
    SELECT DISTINCT
    	 C.[comptebancaire_code]
    	,C.[comptebancaire_sousRole]
    FROM [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C
    where C.comptebancaire_codeDOM is null
     
     
    OPEN curs_sansDEF
     
    FETCH NEXT FROM curs_sansDEF INTO @codeBMDM, @sousrole
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @association = @codeBMDM
    SET @association += @sousrole
    PRINT @association
     
    	IF @sousrole IN (SELECT T.CBsousrole from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T, [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    WHERE  T.CBsousrole = C.comptebancaire_sousRole AND T.codeDomELODIE<>'DEF' AND C.comptebancaire_codeDOM is null AND C.comptebancaire_code != T.CBcode)
     
     
    	BEGIN
    	     SELECT @temp= (select(max(T.codeDomELODIE)+1) from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T inner join [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    							   on T.CBsousrole=C.[comptebancaire_sousRole] AND C.comptebancaire_codeDOM is null AND T.codeDomELODIE<>'DEF')
     
    		INSERT INTO [MW_CONCEPTION].[dbo].[TRANSCO_MW-01]
    		VALUES(@temp,@codeBMDM,@sousrole)
     
    	END
     
    	IF @association NOT IN (SELECT T.CBcode +T.CBsousrole from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T, [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
           WHERE  T.CBsousrole = C.comptebancaire_sousRole AND T.codeDomELODIE<>'DEF' AND C.comptebancaire_codeDOM is null AND C.comptebancaire_code = T.CBcode)
     
    	BEGIN
    	     INSERT INTO [MW_CONCEPTION].[dbo].[TRANSCO_MW-01]
    	VALUES('DX1',@codeBMDM,@sousrole)
    END
     
     UPDATE [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] 
    		SET [comptebancaire_codeDOM]=T.codeDomELODIE
    		FROM [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C inner join [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T
        ON T.CBcode = C.comptebancaire_code AND T.CBsousrole=C.[comptebancaire_sousRole]
    	WHERE C.comptebancaire_codeDOM is null
     
    	FETCH NEXT FROM curs_sansDEF INTO @codeBMDM, @sousrole
    END 
     
    CLOSE curs_sansDEF
    DEALLOCATE curs_sansDEF
    le resultat est le suivant:


    id codeDomELODIE CBcode CBsousrole
    1 01 29006 73300500|FOUR|FAPP|0960
    3 02 29005 73452000|AGRI|TNA|0960
    4 003 29005 73452000|FOUR|FAPP|0960
    35 05 20000 74054120|AGRI|TNA|0960
    409 DEF 73300500FOURFAPP0960 73300500|FOUR|FAPP|0960
    410 DEF 73300500FOURFGEN72 73300500|FOUR|FGEN|72
    411 DEF 73452000AGRITNA0960 73452000|AGRI|TNA|0960
    412 DEF 73452000FOURFAPP0960 73452000|FOUR|FAPP|0960
    601 DX1 29005 73452000|FOUR|FAPP|0960
    602 DX1 29006 73300500|FOUR|FAPP|0960
    603 DX1 29007 73300500|FOUR|FGEN|72
    606 DX1 29010 73453100|FOUR|FAPP|0960
    607 6 44369 74054120|AGRI|TNA|0960
    608 DX1 44369 74054120|FOUR|FAPP|0960

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Je n'ai rien compris à votre problème, et sans plus d'eléments, ça va être difficile de vous aider.

    Fournissez :
    - la structure de vos table
    - un jeu d'essai
    - le résultat attendu.

    A mon avis, vous pouvez remplacer toute votre procédure par une seule requete.

    Quel est le rôle de votre dernier UPDATE dans votre boucle ? pourquoi est-il dans la boucle ?

  3. #3
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut mise de table avec curseur
    Le probleme est que je fais une insertion dans une table transco si l'association du sousrole et du code de la table bancaire n'existe
    pas dans la trable transco, dans ce cas je fais une insertion d'une ligne avec une valeur constante pour le codeDOM. dans le cas ou seul le sousrole est present dans la table transco alors il prend le max du codedom du sousrole dans la table transco +1 et il insert une nouvelle
    ligne dans la table transco avec le même sousrole le codedom+1 et le code de la table comptebancaire

    ma table transco est constitué de trois colonnes:

    codeDOM code sousrole
    01 29006 73300500|FOUR|FAPP|0960
    02 29005 73452000|AGRI|TNA|0960
    003 29005 73452000|FOUR|FAPP|0960
    05 20000 74054120|AGRI|TNA|0960

    une table comptebancaire avec les colonnes suivantes:


    code codedom sousrole nombanque ......
    29006 null 73300500|FOUR|FAPP|0960
    29007 null 73300500|FOUR|FGEN|72
    29005 null 73452000|AGRI|TNA|0960


    le update dans la boucle permet de mettre a jour le champ codedom de la table comptebancire
    après insertion de la ligne dans la table transco

    le tout fonctionne bien sauf que lors de l'insertion dans la table transco il m'insert encore
    ces lignes 003 29005 73452000|FOUR|FAPP|0960
    01 29006 73300500|FOUR|FAPP|0960
    $avec un codedom dx1

    or c'est des ligne qui existent deja dans la table transco, donc je ne dois plus les avoir avec le codedom a dx1

  4. #4
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut mise de table avec curseur
    Bonjour a vous tous,

    Quelqu'un pourrait m'aider pour ma requête, j'y ai passé la soirée d'hier mais j'ai pas trouvé solution
    pour qu’il ne me retourne pas les valeurs qui existent deja

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Honnêtement, c'est tout sauf clair.

    Je ne comprends absolument pas ce que vous cherchez à faire.

    Prenez le temps de fournir :
    - Un script SQL de création des tables
    - Un script SQL d'insertion des données d'exemple
    - DE NOUS EXPLIQUER CORRECTEMENT CE QUE VOUS CHERCHEZ A FAIRE

    ET RELISEZ-VOUS.

    Votre explication est un véritable charabia : dès qu'on crois avoir compris un mot, le suivant nous indique le contraire.
    Visiblement c'est pas clair dans votre tête, donc prenez le temps de l'expliquer correctement : y'a 9 chances sur 10 pour que votre solution vous saute au nez quand vous prendrez le temps d'expliquer votre problème.

    Gardez bien à l'esprit cet adage : "problème bien posée, à moitié résolu".
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut mise de table avec curseur
    Désolé si je me suis mal exprimé dans mon explication,


    Structure de la table transco

    codeDOM code code sousrole
    01 29006 73300500|FOUR|FAPP|0960
    02 29005 73452000|AGRI|TNA|0960
    003 29005 73452000|FOUR|FAPP|0960
    R001 20000 74054120|AGRI|TNA|0960
    def 14214 73300500|FOUR|FAPP|0960
    structure de la table comptebancaire


    code codedom sousrole nombanque ......
    29006 null 73300500|FOUR|FAPP|0960
    29007 null 73300500|FOUR|FGEN|72
    29005 null 73452000|AGRI|TNA|0960

    je veux mettre a jour la colonne codedom de la table comptebancaire avec l'énoncé ci dessous

    étant donné que je me suis mal expliqué, voici mon énoncé:

    Si l'association compteBancaire.code compteBancaire.sous-rôle existe dans la table de transcodification MW-01 alors transcodification (attention prévoir une transcodification de compteBancaire.sousRole pour le comparer au format Elodie)
    Sinon, rechercher dans la table MW-01 si un enregistrement existe dont le sous-rôle correspond au "code auxi, type auxi et société" de la fiche ELODIE :
    1. Si aucun enregistrement n'existe alors code= 'R001' et ajouter la ligne dans la table de transco MW-01 avec le nouveau code du compte bancaire MDM, le sous-rôle et le code Elodie = 'R001'.
    2. si il existe déjà un ou plusieurs enregistrements dont aucun code commence par 'R' alors code= 'R001' et ajouter la ligne dans la table de transco MW-01 avec le nouveau code du compte bancaire MDM, le sous-rôle et le code Elodie = 'R001'.
    3. si il existe déjà un ou plusieurs enregistrements dont au moins un code commence par 'R' alors code= R00(N+1) (avec N=plus grand chiffre après la lettre R parmi les codes)
    et ajouter une ligne dans la table MW-01 avec le code du compte bancaire MDM, le sous-rôle et le nouveau code Elodie.

    j'espère avec cette explication vous allez comprendre ce que je recherche a faire

    j'ai essayé de faire un curseur 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
    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
     
    DECLARE @temp		VARCHAR(255)
    DECLARE @temp1       VARCHAR (255)
    DECLARE @temp2       VARCHAR (255)
    DECLARE @codeBMDM	VARCHAR(255)
    DECLARE @sousrole	VARCHAR(255)
    DECLARE @association  VARCHAR(255)
     
     
     
    DECLARE curs_sansDEF CURSOR FAST_FORWARD FOR
    SELECT DISTINCT
    	 C.[comptebancaire_code]
    	,C.[comptebancaire_sousRole]
    FROM [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C
    where C.comptebancaire_codeDOM is null
     
     
    OPEN curs_sansDEF
     
    FETCH NEXT FROM curs_sansDEF INTO @codeBMDM, @sousrole
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @association = @codeBMDM
    SET @association += @sousrole
    PRINT @association
     
    	IF @association IN (SELECT T.CBsousrole from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T, [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    WHERE  T.CBsousrole = C.comptebancaire_sousRole AND T.codeDomELODIE<>'DEF' AND C.comptebancaire_codeDOM is null AND C.comptebancaire_code = T.CBcode)
     
     
    	BEGIN
    	     SELECT @temp= (select T.codeDomELODIE from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T inner join [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    							  on T.CBsousrole=C.[comptebancaire_sousRole] AND C.comptebancaire_codeDOM is null AND T.codeDomELODIE<>'DEF' AND C.comptebancaire_code = T.CBcode )
     
    	END
     
    	SELECT @temp1= T.codeDomELODIE 
    	FROM [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T, [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
        WHERE  T.CBsousrole = C.comptebancaire_sousRole AND T.codeDomELODIE<>'DEF' AND C.comptebancaire_codeDOM is null AND C.comptebancaire_code != T.CBcode
       print @temp1  
     
       IF @temp1 IS NULL
     
    	BEGIN
    	     INSERT INTO [MW_CONCEPTION].[dbo].[TRANSCO_MW-01]
    	VALUES('R001',@codeBMDM,@sousrole)
     
    END
    ELSE
       BEGIN 
       SELECT @temp2=(select max(T.codeDomELODIE)+1 from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T inner join [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    							   on T.CBsousrole=C.[comptebancaire_sousRole] AND C.comptebancaire_codeDOM is null AND T.codeDomELODIE<>'DEF')
     
    		INSERT INTO [MW_CONCEPTION].[dbo].[TRANSCO_MW-01]
    		VALUES(@temp,@codeBMDM,@sousrole)
     
    END
      		UPDATE [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] 
    		SET [comptebancaire_codeDOM]=T.codeDomELODIE
    		FROM [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C INNER JOIN [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T
        ON T.CBcode = C.comptebancaire_code AND T.CBsousrole=C.comptebancaire_sousRole
    	WHERE C.comptebancaire_codeDOM IS NULL
    	FETCH NEXT FROM curs_sansDEF INTO @codeBMDM, @sousrole
    END 
     
    CLOSE curs_sansDEF
    DEALLOCATE curs_sansDEF
    Mais je ne sais pas comment faire pour le max +1 (caractère + int)

  7. #7
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Si Je ne me trompe pas au vue de ta syntaxe des curseurs tu est sous SQL Server je te conseil vivement de regarder MERGE Qui peut répondre à ton besoin sans curseurs désastreux pour les perfs ....

    Pour ce qui est d'additionner 'RXXX' + N ou XXX est un entier et N aussi
    Alors essaye ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'R'+Right('000'+cast(Cast(substring('R003',2,3) as int )+1 as varchar(3)),3)
    Dans cette exemple N = 1 et XXX= 003
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  8. #8
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut mise de table avec curseur
    Merci Mokona pour cette solution, mais quand je l'ai mit dans ma requete, elle me retourne plusieurs valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (select 'R'+RIGHT('000'+cast(Cast(substring(T.codeDomELODIE,2,3) AS int )+1 AS varchar(3)),3) from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T inner join [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    							   on T.CBsousrole=C.[comptebancaire_sousRole] AND C.comptebancaire_codeDOM is null AND T.codeDomELODIE<>'DEF')

    au lieu de R002 comme resultat, j'ai R002, R003,R004,R002

    ce qui fait que j'ai une erreur de la sous requete a retourné plusieurs valeur

  9. #9
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Il ne te manquerai pas un MAX , par hasard


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (select 'R'+RIGHT('000'+cast(MAX(Cast(substring(T.codeDomELODIE,2,3) AS int ))+1 AS varchar(3)),3) from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T inner join [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
    							   on T.CBsousrole=C.[comptebancaire_sousRole] AND C.comptebancaire_codeDOM is null AND T.codeDomELODIE<>'DEF'  )
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  10. #10
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut mise de table avec curseur
    oui effectivement, j'avais oublié le max. merci pour cette solution que vous m'avez apporté.
    j'ai pas encore les bon résultats, je vais revoir les conditions de mon curseur

  11. #11
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    A la place de ton curseur UTILISE MERGE http://msdn.microsoft.com/fr-fr/libr...=sql.100).aspx
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  12. #12
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut mise de table avec curseur
    j'ai ma table transco qui a une structure suivante avant l'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    codeDomELODIE	CBcode	CBsousrole
    01	29006	73300500|FOUR|FAPP|0960
    02	29005	73452000|AGRI|TNA|0960
    003	29005	73452000|FOUR|FAPP|0960
    R01	20000	74054120|AGRI|TNA|0960
    DEF	73300500FOURFAPP0960	73300500|FOUR|FAPP|0960
    DEF	73300500FOURFGEN72	         73300500|FOUR|FGEN|72

    dans mon curseur, j'ai la condition suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET @association = @codeBMDM
    SET @association += @sousrole
    IF @association NOT IN (SELECT T.CBcode +T.CBsousrole from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T, [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C 
           WHERE  T.CBsousrole = C.comptebancaire_sousRole AND T.codeDomELODIE<>'DEF' AND C.comptebancaire_codeDOM is null AND C.comptebancaire_code = T.CBcode)
     
    	BEGIN
    	     INSERT INTO [MW_CONCEPTION].[dbo].[TRANSCO_MW-01]
    	VALUES('R01',@codeBMDM,@sousrole)
    END

    après insertion, sa structure est la suivante:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    codeDomELODIE	CBcode	CBsousrole
    01	29006	73300500|FOUR|FAPP|0960
    02	29005	73452000|AGRI|TNA|0960
    003	29005	73452000|FOUR|FAPP|0960
    R01	20000	74054120|AGRI|TNA|0960
    DEF	73300500FOURFAPP0960  73300500|FOUR|FAPP|0960
    DEF	73300500FOURFGEN72	73300500|FOUR|FGEN|72
    R01	29005	73452000|FOUR|FAPP|0960
    R01	29006	73300500|FOUR|FAPP|0960
    R01	29007	73300500|FOUR|FGEN|72
    R01	29010	73453100|FOUR|FAPP|0960
    R02	44369	74054120|AGRI|TNA|0960
    R01	44369	74054120|FOUR|FAPP|0960
    Je ne devrais plus avoir ses deux lignes soulignés puisqu'il existaient deja dans la table transco. pourtant ma condition me semble etre juste
    je suis presque a la fin de trouver solution a mon énonce, pouvez vous m'aidez

    Merci

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Depuis le début, je pense que vous avez un souci avec :
    - soit la méthodologie
    - soit la requête de sélection (du curseur)

    En effet, mettons 3 lignes avec le même code, qui n'est pas présent dans la table de transco.
    => Alors le curseur contient 3 lignes, donc ta boucle va insérer 3 lignes dans la table de transco.

    Donc il faut changer soit la méthodologie, en remplaçant le curseur par une bouche qui récupère le TOP 1 de la même sélection, et qui boucle tant que la requête ramène des lignes. Je ne te le recommande pas, ça va être lent.

    Donc la seconde solution, c'est de modifier la requête qui alimente le curseur pour ne ramener qu'une unique valeur distincte pour chaque code inexistant.
    => A ce moment, un seul INSERT.
    => Mais aussi un UPDATE qui mettra à jour toutes les lignes correspondantes au code qu'on vient d'insérer.
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Mise à jours des tables avec un dump
    Par The Bronx 05 dans le forum Import/Export
    Réponses: 2
    Dernier message: 15/07/2012, 12h41
  2. mise a jours 1 table avec 2 table
    Par Commandeur dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/12/2009, 13h55
  3. mise à jour de table avec jointure
    Par NorexaMS dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/03/2009, 14h09
  4. Mettre à jour des tables avec un trigger
    Par Titouf dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/01/2008, 15h57
  5. mise à jour de table avec somme
    Par dirtyjs dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/11/2006, 11h05

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