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 :

Conversion requête de oracle ver SQL server


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut Conversion requête de oracle ver SQL server
    Bonjour,

    j'ai transcris une requête opérationnel sur Oracle vers SQL server 2008.

    j'ai un petit problème de résultat sur la requête SQL server. Il ne me renvoie pas le même nombre de ligne ou j'ai bcp de ligne NULL.

    Je pense que mon problème provient des jointures externes.

    Requête Oracle :

    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
    SET VERIFY OFF;
    SET HEADING OFF;
    SET PAGESIZE 0;
    SET LINESIZE 2000;
    SET FEEDBACK OFF;
    SET TERMOUT OFF;
    SET TRIMSPOOL ON;
    SPOOL &3;
     
    SELECT 	F.SEC_NO_EQUIPE||'|'||
    	B.REP_CODE_TELEPHONIQUE||'|'||
    	B.REP_NOM||'|'||
    	B.REP_PRENOM||'|'||
    	TO_CHAR(A.HORT_DATE, 'YYYYMMDD')||'|'||
    	A.HORT_DUREE_ACTIVITES_MIN||'|'||
    	A.HORT_LEGENDE||'|'||
    	D.RES_CODE||'|'||
    	B.REP_NO_EMPLOYE||'|'||
    	B.REP_TELEPHONE_01
    FROM 	CALHORAIRESXJOURXPREPOSE A,
    	CALPREPOSES B,
    	CALPREPOSESXEQUIPE C,
    	CALTYPESCONTRAINTE D,
    	CALCONTRAINTESXPREPOSE E,
    	CALEQUIPES F
    WHERE 	A.HORT_DATE>=TO_DATE ('&1','DD/MM/YYYY') AND
    	A.HORT_DATE<=TO_DATE ('&2','DD/MM/YYYY') AND
    	F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE AND
    	B.REP_SEQUENCE=C.REP_SEC_XRF_REP_SEQUENCE AND
    	B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE AND
    	A.HORT_LEGENDE NOT LIKE '%Non disponible%' AND
    	D.RES_SEQUENCE(+) = E.REP_RES_XRF_RES_SEQUENCE AND
    	E.REP_RES_SEQUENCE(+) = A.HORT_REF_RES_PRO_SEQUENCE
    ORDER BY 	A.HORT_DATE,
    		C.REP_SEC_REF_NO_EQUIPE,
    		B.REP_CODE_TELEPHONIQUE,
    		A.HORT_HEURE_DEBUT;
    SPOOL OFF;
    EXIT;
    Requête SQL Server :

    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
     
    SELECT CAST(
    			CASE CHARINDEX('PROD ENTRAIDE', A.HORT_LEGENDE) 
    				WHEN 0 THEN F.SEC_NO_EQUIPE 
    				ELSE SUBSTRING(A.HORT_LEGENDE, CHARINDEX('PROD ENTRAIDE', A.HORT_LEGENDE) + 13, 7) 
    			END AS VARCHAR) + '|' + CAST(B.REP_CODE_TELEPHONIQUE AS VARCHAR) + '|' + CAST(B.REP_NOM AS VARCHAR) + '|' + CAST(B.REP_PRENOM AS VARCHAR) + '|' + CONVERT(VARCHAR(8), A.HORT_DATE,112) + '|' + CAST(A.HORT_DUREE_ACTIVITES_MIN AS VARCHAR) + '|' + CAST(
    			CASE CHARINDEX('ENTRAIDE', A.HORT_LEGENDE) 
    				WHEN 21 THEN ((SUBSTRING(A.HORT_LEGENDE, 1, 20) + 'En service ') + SUBSTRING(A.HORT_LEGENDE, 21, LEN(A.HORT_LEGENDE))) 
    				ELSE A.HORT_LEGENDE 
    			END AS VARCHAR) + '|' + CAST(D.RES_CODE AS VARCHAR) + '|' + CAST(B.REP_NO_EMPLOYE AS VARCHAR) + '|' + RTRIM(LTRIM(CAST(B.REP_TELEPHONE_01 AS VARCHAR)))
    	FROM  CALTYPESCONTRAINTE D  RIGHT OUTER JOIN  CALCONTRAINTESXPREPOSE E  ON  D.RES_SEQUENCE  = E.REP_RES_XRF_RES_SEQUENCE   RIGHT OUTER JOIN  CALHORAIRESXJOURXPREPOSE A  ON  E.REP_RES_SEQUENCE  = A.HORT_REF_RES_PRO_SEQUENCE ,
    		 CALPREPOSES B,
    		 CALPREPOSESXEQUIPE C,
    		 CALEQUIPES F 
    WHERE 	A.HORT_DATE  >= CONVERT(DATETIME, "02/04/2012", 103) AND
    	A.HORT_DATE  <= CONVERT(DATETIME, "30/04/2012", 103) AND
    	F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE AND
    	B.REP_SEQUENCE=C.REP_SEC_XRF_REP_SEQUENCE AND
    	B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE AND
    	A.HORT_LEGENDE NOT LIKE '%Non disponible%'
    	ORDER BY A.HORT_DATE,
    		 C.REP_SEC_REF_NO_EQUIPE,
    		 B.REP_CODE_TELEPHONIQUE,
    		 A.HORT_HEURE_DEBUT
    Merci de votre aide.

  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 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Il faut utiliser la fonction normative COALESCE pour dénullifier.

    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/ * * * * *

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    merci pour ta réponse.


    Comment je peux utiliser cette commande car j'ai fait quelques tests ce n'est pas très concluant.

    Moi je pensais que le problème provenait de la jointure externe.


    -Résultat oracle (bon) 53 lignes
    0100-21|12340|xxxxxx|CAMILLE|20120402|255|09:00 - 13:15 = En service||00580|xx0901
    0100-21|12340|xxxxxx|CAMILLE|20120402|90|13:15 - 14:45 = Déjeuner||00580|xxx0901
    0100-21|12340|xxxxxx|CAMILLE|20120402|210|14:45 - 18:15 = En service||00580|xx0901
    0100-21|12434|xxxxxx|MELANIE|20120402|180|09:00 - 12:00 = En service||00649|xx1056
    0100-21|12434|xxxxxx|MELANIE|20120402|60|12:00 - 13:00 = Déjeuner||00649|xx1056
    0100-21|12434|xxxxxx|MELANIE|20120402|285|13:00 - 17:45 = En service||00649|xx1056
    0100-21|12814|MILAN|FREDERIC|20120402|285|07:00 - 11:45 = En service||00880|xx1426

    - Resultat SQL server (pas bon) 6000 ligne

    NULL
    NULL
    NULL
    NULL
    NULL
    0100-01|12838|xxxxx|IDA|20120402|195|09:30 - 12:45 = ENTRAIDE C|PROD29|00011423|xx2825
    NULL
    0100-01|12838|xxxxx|IDA|20120402|135|13:45 - 16:00 = ENTRAIDE C|PROD29|00011423|xx2825
    NULL
    NULL
    0100-01|12899|xxxxx|AUDREY|20120402|195|09:30 - 12:45 = ENTRAIDE C|PROD29|00011328|xx2709

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Quelques pistes pour chercher :

    Essayez de voir en enlevant les lignes null (un simple WHERE MaColonne IS NOT NULL) du résultat de SQL SERVER. Peut-être que sans les lignes à NULL le résultat correspond tout de même.

    Si c'est pas bon, pour voir plus facilement d'ou peut venir le problème remplacez le SELECT que vous avez actuellement dans SQL SERVER par un SELECT plus simple du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 	F.SEC_NO_EQUIPE,
    	B.REP_CODE_TELEPHONIQUE,
    	B.REP_NOM,
    	B.REP_PRENOM,
    	A.HORT_DATE,
    	A.HORT_DUREE_ACTIVITES_MIN,
    	A.HORT_LEGENDE,
    	D.RES_CODE,
    	B.REP_NO_EMPLOYE,
    	B.REP_TELEPHONE_01
    De cette façon vous pourrez voir plus facilement de quelle colonne le problème vient et vous trouverez le problème surement plus facilement en vous disant : "mais c'est bien sur cette jointure je l'ai mal faite !".

    Dernière piste, vos jointures me semble un peu bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FROM  CALTYPESCONTRAINTE D
       RIGHT OUTER JOIN  CALCONTRAINTESXPREPOSE E  ON  D.RES_SEQUENCE  = E.REP_RES_XRF_RES_SEQUENCE
       RIGHT OUTER JOIN  CALHORAIRESXJOURXPREPOSE A  ON  E.REP_RES_SEQUENCE  = A.HORT_REF_RES_PRO_SEQUENCE ,
       CALPREPOSES B,
       CALPREPOSESXEQUIPE C,
       CALEQUIPES F
    Notamment pour les tables CALPREPOSES, CALPREPOSESXEQUIPE, CALEQUIPES pour lesquelles il n'y a pas de lien avec les autres (INNER JOIN, LEFT JOIN etc...).

    Bon courage.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    j'ai trouvé mon problème c'est le champ D.RES_CODE qui fait que j'ai des lignes NULL.

    les valeur de ce champ sont par exemple RH4 et RH14

    j'ai essayé une conversion avec Convert

    Convert(varchar(8),D.RES_CODE)

    et aussi avec CAST

    CAST(D.RES_CODE as varchar(8))

    Je ne vois pas comment faire

  6. #6
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Pourquoi faire des RIGHT OUTER JOIN, alors que toutes les contraintes portent sur les autres tables ?
    Prenez la requête par le bon bout : vous prenez des lignes des tables A, B, C, F avec des jointures fortes et des restrictions, et en plus des éléments des tables E (en jointure ouverte avec A) et D (en jointure ouverte avec E).

    Donc la requête devrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ...
      FROM  CALHORAIRESXJOURXPREPOSE  A
               INNER JOIN CALPREPOSES  B ON (B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE)
               INNER JOIN CALPREPOSESXEQUIPE  C ON (C.REP_SEC_XRF_REP_SEQUENCE = B.REP_SEQUENCE)
               INNER JOIN CALEQUIPES F ON (F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE)
               LEFT JOIN CALCONTRAINTESXPREPOSE  E ON (E.REP_RES_SEQUENCE = A.HORT_REF_RES_PRO_SEQUENCE)
               LEFT JOIN CALHORAIRESXJOURXPREPOSE D ON (D.RES_SEQUENCE= E.REP_RES_XRF_RES_SEQUENCE)

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    j'essaie de modifier ma requête mais j'ai encore une erreur sur la jointure.
    SQL server me dit que D.RES_SEQUENCE n'est pas un nom de colonne valide. sur la dernière jointure LEFT

    SELECT F.SEC_NO_EQUIPE + '|' +
    B.REP_CODE_TELEPHONIQUE + '|' +
    B.REP_NOM + '|' +
    B.REP_PRENOM + '|' +
    CONVERT(VARCHAR(8), A.HORT_DATE,112) + '|' +
    CONVERT(VARCHAR(8),A.HORT_DUREE_ACTIVITES_MIN ) + '|' +
    A.HORT_LEGENDE + '|' +
    CONVERT(CHAR(7),G.RES_CODE ) + '|' +
    B.REP_NO_EMPLOYE + '|' +
    B.REP_TELEPHONE_01


    FROM CALHORAIRESXJOURXPREPOSE A
    INNER JOIN CALPREPOSES B ON (B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE)
    INNER JOIN CALPREPOSESXEQUIPE C ON (C.REP_SEC_XRF_REP_SEQUENCE = B.REP_SEQUENCE)
    INNER JOIN CALEQUIPES F ON (F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE)
    LEFT JOIN CALCONTRAINTESXPREPOSE E ON (E.REP_RES_SEQUENCE = A.HORT_REF_RES_PRO_SEQUENCE)
    LEFT JOIN CALHORAIRESXJOURXPREPOSE D ON (D.RES_SEQUENCE= E.REP_RES_XRF_RES_SEQUENCE),
    CALTYPESCONTRAINTE G


    WHERE A.HORT_DATE >= CONVERT(DATETIME, '02/04/2010', 103) AND
    A.HORT_DATE <= CONVERT(DATETIME, '30/04/2010', 103) AND
    F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE AND
    B.REP_SEQUENCE=C.REP_SEC_XRF_REP_SEQUENCE AND
    B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE AND
    A.HORT_LEGENDE NOT LIKE '%Non disponible%'
    ORDER BY A.HORT_DATE,
    C.REP_SEC_REF_NO_EQUIPE,
    B.REP_CODE_TELEPHONIQUE,
    A.HORT_HEURE_DEBUT

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    J'ai fait une erreur de copier-coller, la table aliasée en D n'est pas la bonne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ...
      FROM  CALHORAIRESXJOURXPREPOSE  A
               INNER JOIN CALPREPOSES  B ON (B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE)
               INNER JOIN CALPREPOSESXEQUIPE  C ON (C.REP_SEC_XRF_REP_SEQUENCE = B.REP_SEQUENCE)
               INNER JOIN CALEQUIPES F ON (F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE)
               LEFT JOIN CALCONTRAINTESXPREPOSE  E ON (E.REP_RES_SEQUENCE = A.HORT_REF_RES_PRO_SEQUENCE)
               LEFT JOIN CALTYPESCONTRAINTE  D ON (D.RES_SEQUENCE= E.REP_RES_XRF_RES_SEQUENCE)
    Edit : par ailleurs, il faudrait supprimer les conditions de jointure du WHERE.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    La requête s’exécute bien mais je n'ai aucune ligne

    SELECT F.SEC_NO_EQUIPE + '|' +
    B.REP_CODE_TELEPHONIQUE + '|' +
    B.REP_NOM + '|' +
    B.REP_PRENOM + '|' +
    CONVERT(VARCHAR(8), A.HORT_DATE,112) + '|' +
    CONVERT(VARCHAR(8),A.HORT_DUREE_ACTIVITES_MIN ) + '|' +
    A.HORT_LEGENDE + '|' +
    D.RES_CODE + '|' +
    B.REP_NO_EMPLOYE + '|' +
    B.REP_TELEPHONE_01


    FROM CALHORAIRESXJOURXPREPOSE A
    INNER JOIN CALPREPOSES B ON (B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE)
    INNER JOIN CALPREPOSESXEQUIPE C ON (C.REP_SEC_XRF_REP_SEQUENCE = B.REP_SEQUENCE)
    INNER JOIN CALEQUIPES F ON (F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE)
    LEFT JOIN CALCONTRAINTESXPREPOSE E ON (E.REP_RES_SEQUENCE = A.HORT_REF_RES_PRO_SEQUENCE)
    LEFT JOIN CALTYPESCONTRAINTE D ON (D.RES_SEQUENCE= E.REP_RES_XRF_RES_SEQUENCE)



    WHERE A.HORT_DATE >= CONVERT(DATETIME, '02/04/2010', 103) AND
    A.HORT_DATE <= CONVERT(DATETIME, '30/04/2010', 103) AND
    F.SEC_SEQUENCE=C.REP_SEC_XRF_SEC_SEQUENCE AND
    B.REP_SEQUENCE=C.REP_SEC_XRF_REP_SEQUENCE AND
    B.REP_SEQUENCE=A.HORT_XRF_REP_SEQUENCE AND
    A.HORT_LEGENDE NOT LIKE '%Non disponible%'

    ORDER BY A.HORT_DATE,
    C.REP_SEC_REF_NO_EQUIPE,
    B.REP_CODE_TELEPHONIQUE,
    A.HORT_HEURE_DEBUT

Discussions similaires

  1. migration de oracle vers sql server 2005 - linked server
    Par aemag dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/10/2006, 16h31
  2. [Migration] Oracle vers SQL Server 2005 - Problème de BLOB
    Par thomasrenault dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/02/2006, 11h26
  3. Traduction de code Oracle vers SQL Server
    Par randomcl dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/11/2005, 00h43
  4. [debutan] migration de données Oracle vers SQL SERVER 2000
    Par Mil00se dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/08/2005, 18h44
  5. Migration de données Oracle vers SQL server
    Par joul's dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 16/02/2005, 16h05

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