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 :

Convertir des champs type VARCHAR vers FLOAT


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Prof maths
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Prof maths
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Points : 12
    Points
    12
    Par défaut Convertir des champs type VARCHAR vers FLOAT
    Salut tout le monde ,

    Je travaille sur une app VB.NET avec une BDD SQL SERVER 2008 R2
    Pour résumer la situation j'essaye de convertir des champs de la table Credits qui sont de type varchar en float pour faire une mise à jour des paiements des clients , voici la table : Credits (idcredit , id client , idproduit , montant , avance , reste).

    Les champs : montant , avance et reste sont de type varchar et ce que j'essaye de faire est de :

    1-Avec la fonction REPLACE de remplacer l'espace qui symbolise le groupement des chiffres : REPLACE(avance,' ','') par exemple 5 200,00 £ devra etre 5200,00 £ puis de remplacer aussi la virgule (comma) par le point décimal seul reconnu par SQL SERVER comme séparateur décimal ( l'erreur s'affiche : Cannot convert varchar datatype to float car dans mes paramètres régionaux la virgule est le séparateur décimal ) et cela pour les deux autres champs : "montant" et "reste"

    REPLACE (avance,',','.') donc 5 200,00 £ devra etre 5 200.00£

    Donc j'ai essayé de changer mes paramètres régionaux en utilisant le point décimal comme séparateur décimal mais je n'arrive pas à comprendre pourquoi SQL SERVER 2008 R2 me donne toujours cette erreur : Error converting data type varchar to float.

    Voici mon code ( J'essaye de calculer le reste en fonction des versements du client )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ALTER PROC [dbo].[CALC_RESTECREDIT]
     
    @id int,
    @montaj varchar(50)
     
    as
     
    UPDATE Credits SET Avance = CAST(replace(Avance,'  ','') as float)  + CAST(replace(@montaj,'  ','') as float)
          ,Reste =CAST(replace(MontVente,'  ','') as float) - CAST(replace(Avance,'  ','') as float) 
     
    WHERE ClientID =@id
    Merci d'avance

  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 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    C'est normal, un nombre ne peut pas comporter de lettre or le symbole £ est une lettre. Vous ne devez prendre que la partie purement numérique !

    Vous pouvez utiliser par exemple la fonction de nettoyage 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
     
    CREATE FUNCTION dbo.F_STRING_TO_FLOAT (@STRING VARCHAR(max))
    RETURNS FLOAT
    WITH RETURNS NULL ON NULL INPUT
    AS
    BEGIN
       DECLARE @I INT, @C CHAR(1), @OUT VARCHAR(max);
       SELECT @I = 1, @OUT = '';
       WHILE @I <= LEN(@STRING)
       BEGIN
          SET @C = SUBSTRING(@STRING, @I, 1);
          SET @OUT = @OUT + CASE WHEN @C BETWEEN '0' AND '9' THEN @C
                                 WHEN @C = ',' THEN '.'
                                 ELSE '' END;
          SET @I = @I +1;
       END;
       RETURN CAST(@OUT AS FLOAT)
    END;
    GO
    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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Maxwashere Voir le message
    ...Les champs : montant , avance et reste sont de type varchar ...
    Mais quelle idée de modéliser des montants en varchar , je ne sais pas d'où vient cette mode de mettre du varchar partout, mais c'est la source de bien des ennuis !

    De plus, la devise et le montant n'ont rien à faire dans une colonne unique, et encore moins des séparateurs de milliers !

    Un retour aux fondamentaux merise s'impose

  4. #4
    Invité
    Invité(e)
    Par défaut
    En plus, il existe un type money qui est prévu rien que pour ça... Pourquoi faire simple !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Mais quelle idée de modéliser des montants en varchar , je ne sais pas d'où vient cette mode de mettre du varchar partout, mais c'est la source de bien des ennuis !

    De plus, la devise et le montant n'ont rien à faire dans une colonne unique, et encore moins des séparateurs de milliers !

    Un retour aux fondamentaux merise s'impose
    Ce sont généralement des gens qui viennent soir de MySQmerde, soit d'un ORM bas de gamme du genre Hibernate !

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Prof maths
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Prof maths
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Points : 12
    Points
    12
    Par défaut Convertir des champs type VARCHAR vers FLOAT
    Salut Merci pour vos remarques mais si pouvez utiliser des termes moins choquant et je ne viens pas de MYSQMerde un peu de respect s'impose entre nous car l'erreur est humaine et personne n'est parfait , pour le choix de Varchar à la place d'autres types de données évidents c'est vrai vous avez raison mais ce qui m'a choqué c'est les termes utilisés pour juger les autres avec mépris.

Discussions similaires

  1. Convertir des champs "text" contenant du RichText
    Par jackfirst72 dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 29/07/2009, 10h30
  2. Convertir champ type Varchar en Date ?
    Par link.80 dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/07/2009, 09h26
  3. Convertir une image de type 'int16' vers 'float'
    Par cedji dans le forum Images
    Réponses: 6
    Dernier message: 07/07/2009, 16h06
  4. Convertir des colonnes de données vers un fichier texte
    Par ClaudelMetellus dans le forum Excel
    Réponses: 2
    Dernier message: 28/09/2007, 09h41
  5. concaténer par GROUP BY des champs text/varchar
    Par Fredobdx dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/07/2005, 13h44

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