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 :

[SQL Server 2008] Probleme de jointure


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 20
    Points : 19
    Points
    19
    Par défaut [SQL Server 2008] Probleme de jointure
    Bonjour,

    Je dois migrer une application de SQL Server 2000 vers SQL Server 2008. Et je rencontre un problème de mise à jour sur une vue.

    La vue 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
    15
    16
    17
    18
    19
     
    SELECT     dbo.PFUCSEXE.EXENCE, dbo.PFUCSVMB.VMBRPR, CASE WHEN PRONOM IS NULL 
                          THEN '** Promoteur non affecté **' ELSE PRONOM END AS PRONOM, CASE WHEN PRODES IS NULL THEN '*****' ELSE PRODES END AS PRODES, 
                          CASE WHEN PROTEL IS NULL THEN '*****' ELSE PROTEL END AS PROTEL, CASE WHEN PROFAX IS NULL 
                          THEN '*****' ELSE PROFAX END AS PROFAX, dbo.PFUCSCLI.CLICLI, dbo.PFUCSCLI.CLINOM, dbo.PFUCSVMB.VMBVMB, dbo.PFUCSVMB.VMBRGA, 
                          dbo.PFUCSVMB.VMBNOM, dbo.PFUCSVMB.VMBISI, dbo.PFUCSEXE.EXEQTE, dbo.PFUCSEXE.EXEBOR, dbo.PFUCSBOR.BORDSA, 
                          dbo.PFUCSBOR.BOROPS, dbo.PFUCSBOR.BORSER, dbo.PFUCSVMB.VMBOPR, dbo.PFUCSBOR.BORORI, dbo.PFUCSEXE.EXEMHF, 
                          dbo.PFUCSEXE.EXEFRA, dbo.PFUCSEXE.EXEMFC, dbo.PFUCSEXE.EXESEN, dbo.PFUCSEXE.EXECRS, dbo.PFUCSEXE.EXEDHC, 
                          dbo.PFUCSEXE.EXETMT, dbo.PFUCSVMB.VMBDIV, dbo.PFUCSEXE.EXEPFS, dbo.PFUCSEXE.EXEMSA, dbo.PFUCSEXE.EXEDSA, 
                          dbo.PFUCSEXE.EXERAC, dbo.PFUCSEXE.EXEDTE, dbo.PFUCSEXE.EXEIJG, dbo.PFUCSBOR.BORINT, dbo.PFUCSEXE.EXENJG, 
                          dbo.PFUCSBOR.BORTYP, dbo.PFUCSEXE.EXEVUS, dbo.PFUCSEXE.EXETYP, dbo.PFUCSEXE.EXEOPV, dbo.PFUCSEXE.EXECLE, 
                          dbo.PFUCSBOR.BORRAC, dbo.PFUCSVMB.VMBLHR, dbo.PFUCSREX.REXRAC, dbo.PFUCSVMB.VMBCOP
    FROM         dbo.PFUCSEXE INNER JOIN
                          dbo.PFUCSVMB ON dbo.PFUCSEXE.EXEVMB = dbo.PFUCSVMB.VMBVMB LEFT OUTER JOIN
                          dbo.PFUCSPRO ON dbo.PFUCSVMB.VMBRPR = dbo.PFUCSPRO.PROPRO INNER JOIN
                          dbo.PFUCSBOR ON dbo.PFUCSEXE.EXEBOR = dbo.PFUCSBOR.BORRAC AND dbo.PFUCSEXE.EXESER = dbo.PFUCSBOR.BORSER INNER JOIN
                          dbo.PFUCSCLI ON dbo.PFUCSBOR.BORCLI = dbo.PFUCSCLI.CLICLI LEFT OUTER JOIN
                          dbo.PFUCSREX ON dbo.PFUCSEXE.EXEVMB = dbo.PFUCSREX.REXRAC
    WHERE     (dbo.PFUCSREX.REXTYP = 'JGB')
    et je fais un Update comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE VUCSCEND 
    SET EXEIJG='1', EXENJG=77271
    WHERE EXENCE=0
    	AND convert(varchar,BORDSA,112)<='2009-08-07'
    	AND convert(varchar,EXEDTE,112)<='2009-08-07'
    	AND BORSER = 'BOM'
    	AND EXETYP = 'NOR'
    	AND EXEVUS = '1'
    	AND EXEIJG = '0'
    si j'exécute cette instruction, je me prends le message suivant:
    Msg 4147, Level 15, State 1, Procedure VUCSCEND, Line 20
    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80, using the SET COMPATIBILITY_LEVEL option of ALTER DATABASE. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 4413, Level 16, State 1, Line 1
    Could not use view or function 'VUCSCEND' because of binding errors.

    J'utilise déjà des left et des inner join, je ne sais pas quoi faire pour résoudre mon problème?
    Des suggestions ?

    Merci d'avance ?

    Mic

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    N'avez-vous pas du code type trigger sur votre table dbo.PFUCSEXE ?

    Quelques remarques à propos de votre requête :
    • Utilisez des alias pour les tables, c'est beaucoup plus lisible.
    • Utilisez la fonction coalesce, c'est plus compact que le case.
    • Dès que vous avez plus d'une seule table, réutilisez systémaiquement l'alias pour chaque colonne. Ici vous ne l'avez pas fait pour vos case when justement.
    • Si vous faites une jointure externe et que vous filtrez à postériori sur cette table, l'aspect externe saute. Si vous voulez le conserver il faut mettre le filtre au niveau de la jointure.


    Voici votre vue réécrite en tenant compte de ces remarques :
    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
    SELECT
        EXE.EXENCE,
        VMB.VMBRPR,
        COALESCE(PRO.PRONOM, '** Promoteur non affecté **') AS PRONOM,
        COALESCE(PRO.PRODES, '*****') AS PRODES,
        COALESCE(PRO.PROTEL, '*****') AS PROTEL,
        COALESCE(PRO.PROFAX, '*****') AS PROFAX,
        CLI.CLICLI, CLI.CLINOM, VMB.VMBVMB, VMB.VMBRGA, 
        VMB.VMBNOM, VMB.VMBISI, EXE.EXEQTE, EXE.EXEBOR, BOR.BORDSA, 
        BOR.BOROPS, BOR.BORSER, VMB.VMBOPR, BOR.BORORI, EXE.EXEMHF, 
        EXE.EXEFRA, EXE.EXEMFC, EXE.EXESEN, EXE.EXECRS, EXE.EXEDHC, 
        EXE.EXETMT, VMB.VMBDIV, EXE.EXEPFS, EXE.EXEMSA, EXE.EXEDSA, 
        EXE.EXERAC, EXE.EXEDTE, EXE.EXEIJG, BOR.BORINT, EXE.EXENJG, 
        BOR.BORTYP, EXE.EXEVUS, EXE.EXETYP, EXE.EXEOPV, EXE.EXECLE, 
        BOR.BORRAC, VMB.VMBLHR, REX.REXRAC, VMB.VMBCOP
    FROM 
        dbo.PFUCSEXE AS EXE
        INNER JOIN dbo.PFUCSVMB AS VMB
          ON VMB.VMBVMB = EXE.EXEVMB
        LEFT OUTER JOIN dbo.PFUCSPRO AS PRO
          ON PRO.PROPRO = VMB.VMBRPR
        INNER JOIN dbo.PFUCSBOR AS BOR
          ON BOR.BORRAC = EXE.EXEBOR
         AND BOR.BORSER = EXE.EXESER
        INNER JOIN dbo.PFUCSCLI AS CLI
          ON CLI.CLICLI = BOR.BORCLI
        LEFT OUTER JOIN dbo.PFUCSREX AS REX
          ON REX.REXRAC = EXE.EXEVMB
         AND REX.REXTYP = 'JGB'
    Pour votre update, c'est dommage vous transformez une date en chaîne de caractère que vous comparez à une autre.
    Vous feriez mieux de comparez une date à une date, desfois que vous teniez aux performances :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE VUCSCEND 
    SET EXEIJG = '1',
        EXENJG = 77271
    WHERE
        EXENCE = 0
    AND BORDSA <= cast('2009-08-07' as smalldatetime)
    AND EXEDTE <= cast('2009-08-07' as smalldatetime)
    AND BORSER = 'BOM'
    AND EXETYP = 'NOR'
    AND EXEVUS = '1'
    AND EXEIJG = '0'

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 30/06/2011, 15h48
  2. Il y a t-il des probleme évolution vers SQL Server 2008?
    Par fp65idg dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/02/2010, 20h25
  3. Réponses: 1
    Dernier message: 27/07/2009, 11h45
  4. Probleme de Connexion SQL server 2008 & VB 2008
    Par kashomi dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/11/2008, 09h31
  5. PROBLEME D'INSTALLATION DE SQL SERVER 2008
    Par mayce dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/06/2008, 12h55

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