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

MS SQL Server Discussion :

Convertion dans un CAST


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut Convertion dans un CAST
    Bonjour à tous,

    J'essaye de faire une conversion en entier (int), et comme j'ai des valeurs qui posent problème j'ai mis en place une instruction CASE:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case IsNumeric(Left(A.compte,10))
           when 1 then cast(Left(A.compte,10) as int)
           else cast(Left(A.compte,10) as varchar)
    end AS compte_cr

    But il continue à dire: "Impossible de faire la conversion de xxxxxx en entier".

    Par contre si j'essaye
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case IsNumeric(Left(A.compte,10))
           when 1 then Left(A.compte,10)
           else Left(A.compte,10)+'test'
    end AS compte_cr
    le case marche bien.

    Est-ce que quelqu'un pourrait m'aider svp?
    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Essayez de faire un distinct sur A.compte, il doit y avoir une valeur qui ne peut pas être convertie.

    Si la colonne A.compte est dans la clause where, sql va essayer de convertir toute la colonne et donc planter systèmatiquement.
    J'ai eu un même problème

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Bonjour Donpi, merci de ta réponse.

    En fait il n'y a pas de clause WHERE et il n'y a aussi qu'une seule valeur que passe dans la clause "ELSE"...

    Il est bien identifié (car quand je fais mon test il va bien dans le ELSE) mais pour une raison quelconque il bloque si je mets la conversion dans la première partie du CASE, comme s'il faisait le test même si la valeur doit aller dans la partie ELSE de mon CASE...

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Il y a un souci dans ta logique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case IsNumeric(LEFT(A.compte,10))
           when 1 then cast(LEFT(A.compte,10) AS int)
           else cast(LEFT(A.compte,10) AS varchar)
    end AS compte_cr
    Si A.compte peut être convertie en valeur numérique alors tu convertis A.compte en numérique mais si A.compte ne peut être convertie alors A.compte reste en cha'ine de caractère.

    Dans une colonne tu ne peux avoir qu'un seul type de données : soit INT soit VARCHAR mais pas les 2.

    D'ailleurs ton 2eme test le souligne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case IsNumeric(LEFT(A.compte,10))
           when 1 then LEFT(A.compte,10)
           else LEFT(A.compte,10)+'test'
    end AS compte_cr
    Dans les 2 cas tu ne convertis pas ta colonne A.compte. Le type reste le même.

    ++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Merci mikedavem

    Je comprends ce que tu veux dire. En fait je fais une migration d'une base de donnés Accès vers le SQL Server, et cette requête c'était écrite avec la fonction IIF et marché bien.

    Mais je crois que l'Accès autorise quelques choses que passent pas dans SQL Server...


    Merci encore une fois,
    Marc

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

Discussions similaires

  1. Convert dans le where
    Par ririch dans le forum Développement
    Réponses: 19
    Dernier message: 23/06/2009, 10h05
  2. type de données non valide dans un cast
    Par psyka dans le forum PL/SQL
    Réponses: 3
    Dernier message: 05/03/2009, 11h05
  3. Mystere dans un cast
    Par nox75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/10/2007, 15h51
  4. CONVERT dans ORDERBY
    Par stiko83 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/02/2007, 16h30
  5. Pb de convertion dans les procedures stockées
    Par Yannesco dans le forum SQL
    Réponses: 3
    Dernier message: 08/01/2004, 10h24

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