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 :

[MSSQL] conversion de type


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut [MSSQL] conversion de type
    Bonjour à tous,

    Je tente de faire la MAJ d'une table grâce à une autre table. Seulement une colonne doit respectivement mettre a jour une autre colonne qui ne possède pas le même type, la colonne source est en CHAR et la colonne final et en FLOAT.

    j'ai vue sur le site msdn que cette conversion est implicite...apparemment pas car j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 8114, Niveau 16, État 5, Ligne 1
    Erreur de conversion du type de données varchar en float.
    .

    j'ai donc essayer de passer par des fonctions de conversion comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO [GT].[dbo].[REF_CONSTRtest]
               ([Reference]
               ,[Designation]
               , [P_vente_HT]
                )
     
         SELECT refconst, des_const , CAST(code_rem_ref as float)
         FROM [GT].[dbo].[TAB_TAMPON]
    .

    Et la c'est le drame, j'obtient la même erreur que précèdement.

    Si vous avez une idée du pourquoi du comment n'hésité pas a m'en faire part merci beaucoup.

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    Salut
    la colonne code_rem_ref de type CHAR contient elle des valeurs autres que numerique?
    si oui tu pourra pas mettre du text dans un Float

    ce que tu pourrais faire c'est de faire un test sur code_rem_ref, quand c'est numerique tu fait la MAJ/Insertion avec la valeur de code_rem_ref sinon tu remplace la valeur avec un zero ou NULL!

    Bonne jounrée!

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    Salut ,
    Est-ce que le fait d'avoir un NULL dans "code_rem_ref" peut empecher la conversion ?

    EDIT : oui en fait il y a bien des caractere de temps en temps dans code_rem_ref. Je vais utiliser ton idée.

    Heu une idée de comment je pourrai faire ?

    Merci.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    Salut,

    je pense pas que le NULL peut provoquer l'erreur de converion, mais je suis pas certain.

    Pour ajouter une condition dans ta requete voici un exemple:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT refconst, des_const , (SELECT CASE ISNUMERIC(code_rem_ref) CASE 0 THEN 0 ELSE code_rem_ref END)
    FROM [GT].[dbo].[TAB_TAMPON]
    La fonction ISNUMERIC(PARAM) retourne 0 si PARAM n'est pas numeric et 1 s'il l'est.
    donc l'idée est la suivant:

    -Si isnumeric() retourne 0 tu prend zero comme valeur pour ta colonne (tu peux changer et mettre NULL à la place)
    -Sinon on prend la valeur de code_rem_ref


    Voila, j'espere que ceci t'aideras!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    dans l'impatiente j'avais essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT [vente_ht_ref]
    FROM [GT].[dbo].[TAB_TAMPON]
    WHERE ([vente_ht_ref]  like '%[A-Z]%' AND [vente_ht_ref] LIKE '% %')
    Mais cela ne s'est pas avéré concluant(toujours la meme erreur).

    Donc je vais tester ta solution.

    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    Il me dit qu'il y a une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg 156, Niveau 15, État 1, Ligne 1
    Syntaxe incorrecte vers le mot clé 'CASE'.
    JE ne me suis jamais servit de CASE je ne vois pas trop d'ou viens l'erreur.

    EDIT : j'ai essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO [GT].[dbo].[REF_CONSTRtest]
               ([Reference]
               ,[Designation]
               , [P_vente_HT]
                )
     
         SELECT refconst, des_const , (SELECT [vente_ht_ref] FROM [GT].[dbo].[TAB_TAMPON] WHERE ([vente_ht_ref] NOT like '%[A-Z]%'))
         FROM [GT].[dbo].[TAB_TAMPON]
    Mais la triste reponse de mssql a été assez seche :

    [CODE]
    Msg 512, Niveau 16, État 1, Ligne 1
    La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.
    L'instruction a été arrêtée.
    [CODE]

    Encore une fois si vous avez des idée ^^

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    desolé une erreur de ma part.

    voici la correction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT CASE ISNUMERIC(code_rem_ref) WHEN 0 THEN 0 ELSE code_rem_ref END)
    j'ai mis un CASE au lieu de WHEN

    j'espere que ca va fonctionner maintenant!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    En fait avec ca il me remplace tous par zero le malin ^^

    Et les espace c'est aussi un facteur discriminant pour la conversion ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    Les caracteres sont vraiment numerique puisqu'elles sont du type :
    00004470
    00000000
    00000000
    00215747

    la je ne vois vraiment pas

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    Oui, les espaces ne sont pas numeric, parcontre je vois pas pourquoi il n'accepte pas tes valeurs de type 00004470 ...

    si tu mets ton code peut etre quelqu'un y verrai qqchose...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    alors voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO [GT].[dbo].[REF_CONSTRtest]
               ([Reference]
               ,[Designation]
               , [P_vente_HT]
                )
     
         SELECT refconst, des_const , (SELECT CASE ISNUMERIC([vente_ht_ref]) WHEN 0 THEN 0 ELSE [vente_ht_ref] END)
         FROM [GT].[dbo].[TAB_TAMPON]
    pour l'insertion meme si on la deja vue plus haut

    Puis le format de la table source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE [dbo].[TAB_TAMPON](
    	[refconst] [char](14) NOT NULL DEFAULT (''),
    	[Des_const] [char](60) NOT NULL DEFAULT (''),
    	[vente_ht_ref] [char](10) NOT NULL DEFAULT ((0)),
    ) ON [PRIMARY]
    le format de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    0017689400;CYLINDRE R;00004470
    0000007665;PAQ 50 ETI;00000000
    0000007667;PAQ 50 ETI;00000000
    0000007668;PAQ 50 ETI;00000000
    0000010331;MOT EST ES;00215747
    00000111AF;CHEMISE   ;00010650
    00000111AG;CHEMISE   ;00010650
    Je fait remarquer que les donnée "vente_ht_ref" sont de longueur 8 alors que le champ a une longueur de 10. Serait-ce la source du probleme?

    Et voila la table qui accueille les donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE [dbo].[REF_CONSTRtest](
    	[Reference] [char](14) NOT NULL DEFAULT (''),
    	[Designation] [char](60) NOT NULL DEFAULT (''),
    	[P_vente_HT] [float] NULL DEFAULT ((0)),
    	) ON [PRIMARY]
    Voila voila

    J'espere que c'est plus clair ainsi.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    un peu de nouveau j'ai cette erreur maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg 245, Niveau 16, État 1, Ligne 1
    Échec de la conversion de la valeur varchar '21E1      ' en type de données int.
    Avec la requete suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT refconst, des_const , (SELECT CASE ISNUMERIC(vente_ht_ref) WHEN 1 THEN vente_ht_ref ELSE 0 END)
    FROM [GT].[dbo].[TAB_TAMPON]
    voila voila

  13. #13
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonjour

    Je n'ai pas lu toute la discussion mais seulement ton dernier post.

    Le message d'erreur t'indique que la valeur "21E1" ne peut pas être converti en nombre ce qui est logique.

    Au delà de ce que tu essaies de faire n'est-il pas besoin de se poser la question concernant la qualité de ton fichier. Est-ce bien normal de trouver autre chose qu'un nombre dans ton champs ? Si oui, n'essaie pas de convertir; c'est peine perdu. Si ce n'est pas normal, modifie le programme à la source du fichier afin que ce type d'erreur n'arrive plus.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    Malheureusement pour l'instant mon fichier aura parfois autre chose que des nombres dans ce champ. C'est un csv que je récupère comme cela.
    Mais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT refconst, des_const , (SELECT CASE ISNUMERIC(vente_ht_ref) WHEN 1 THEN vente_ht_ref ELSE 0 END)
    FROM [GT].[dbo].[TAB_TAMPON]
    Ne devrai-t-elle pas me retourner des valeurs convertible ?
    J'avais essayé ca aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO [GT].[dbo].[REF_CONSTRtest]
               ([Reference]
               ,[Designation]
               , [P_vente_HT]
                )
     
         SELECT refconst, des_const , (SELECT[vente_ht_ref] FROM [GT].[dbo].[TAB_TAMPON] WHERE ([vente_ht_ref]  LIKE '%[A-Z]%')
         FROM [GT].[dbo].[TAB_TAMPON]
    Mais il me retourne cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg 512, Niveau 16, État 1, Ligne 1
    La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.
    ou alors serai-ce possible si je stocke le contenu de ma sous-requete dans une variable/NouvelleColonne et que je me serve de cette variable/NouvelleColonne pour faire la MAJ/Insertion ?

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    comme par hasard, la valeur 21E1 ne sera pas une valeur exponentielle?!
    un truc genre 21* 2 puissance 10 ou je ne sais quoi... donc il essaye de mettre une valeur trop grand dans un int...
    parceque ISNUMERIC('21E1 ') retourne bien 1, ca veut dire cette valeur est numeric....

    si tu essayais de mettre ca dans un float?!

  16. #16
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    ou un BIGINT (-2^63 (-9 223 372 036 854 775 808) à 2^63-1 (9 223 372 036 854 775 807)) ou un NUMERIC (entre -10^38 +1 et 10^38-1)...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    arf justement c'est pour les valeurs du type "21E1" qu'il faut que sa me retourne 0
    Parce que ce n'est pas un exponentiel, c'est plutôt un coup de c'est mal tombé.

    Et sinon oui j 'essai bien de mettre de toute façon cette valeur dans un float.
    Bref le mystère rode toujours ^^

  18. #18
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par monsurf Voir le message
    comme par hasard, la valeur 21E1 ne sera pas une valeur exponentielle?!
    un truc genre 21* 2 puissance 10 ou je ne sais quoi... donc il essaye de mettre une valeur trop grand dans un int...
    parceque ISNUMERIC('21E1 ') retourne bien 1, ca veut dire cette valeur est numeric....

    si tu essayais de mettre ca dans un float?!
    En faisant le test, 21En correspond à 21 * 10^n.
    Donc à priori, ce n'est pas trop une erreur d'overflowx...

    Par contre, on constate que ça plante quand tu cast as int, alors que ça marche quand tu cast en float.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Par défaut
    En fait c'est en float que cela ne fonctionne pas.
    Le champ source est en CHAR[10] et le champ de destination est en [FLOAT].
    Et c'est la qu'il me retourne un problème avec la valeur 21E1 en conversion int. Un int qui ne proviens de nulle part sauf de la fonction ISNUMERIC

  20. #20
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par Pinkwyzard Voir le message
    alors voila le code :
    SELECT refconst, des_const , (SELECT CASE ISNUMERIC([vente_ht_ref]) WHEN 0 THEN 0 ELSE [vente_ht_ref] END)
    Tiens, juste une petite question : c'est la requête que tu fais ?
    Parce que si je ne me trompe pas, il faut pas retaper de SELECT avant le case :
    SELECT refconst, des_const , CASE ISNUMERIC([vente_ht_ref]) WHEN 0 THEN 0 ELSE [vente_ht_ref] END

    Bon ça change peut être pas grand chose...
    Par contre, pour le 21E1, j'ai fait le test en créant deux tables monocolonnes, la première en char(10).
    J'ai fait l'insert, et c'est passé sans problème...
    Peux-tu tenter de tester la requête sur un seul enregistrement pour être sûr que le problème vient bien de là ?

Discussions similaires

  1. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 16h16
  2. Conversion de type
    Par sovitec dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2004, 14h29
  3. Conversion de type
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 10h30
  4. [MYSQL] conversion de type sur import de script
    Par sebos63 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/08/2003, 10h00
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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