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 :

isnumeric() avec un D dans la variable [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2008
    Messages : 161
    Points : 133
    Points
    133
    Par défaut isnumeric() avec un D dans la variable
    Bonjour,

    J'ai une variable avec des 0 devant que je souhaiterais enlever dans certains cas (si j'ai que des chiffres).
    Du coup j'effectue un test dans ma variable pour savoir si la valeur est numérique, si c'est le cas je la transforme en numérique pour supprimer les 0 devant, puis en nvarchar.
    Jusque là tout va bien, j'utilise la fonction isnumeric()

    Mais j'ai un souci avec une valeur :
    70405304D3

    Cette valeur contient un D, et ça pose problème...

    Quand je fais un isnumeric('70405304D3') il me retourne 1 et considère donc la valeur comme numérique, et me met la valeur 70405304000
    alors que je souhaiterais conserver 70405304D3.

    ça vient du D et du 3 qu'il interprète comme 000

    Avez-vous déjà rencontré ce problème, et avez-vous des explicaitons ?
    Auriez-vous une idée de comment contourner ce problème ?

    hormis rechercher un D dans la variable ?

    Merci d'avance !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2008
    Messages : 161
    Points : 133
    Points
    133
    Par défaut
    Petite précision, il ne veut pas me le convertir en numérique bien que isnumeric renvoie 1, et c'est en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast(floor('70405304D3') AS numeric(30))
    qu'il me retourne 70405304000

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    En interne, SQL Server utilise une routine C pour ISNUMERIC. Celle-ci accepte la notation avec le D pour les decimaux, ce qui explique ce comportement.

    Vous pourriez avoir le même comportement avec '123e2' sur le même principe.

    Est-ce que votre nombre sera toujours un entier ? auquel cas vous pourriez simplement faire un TRY_CAST(LaColonne AS INT), qui renverra NULL si votre NVARCHAR n'est pas un entier.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2008
    Messages : 161
    Points : 133
    Points
    133
    Par défaut
    Merci pour votre réponse, mais j'ai un message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TRY_CAST' n'est pas une option nom de fonction intégrée reconnue.
    J'ai contourné le problème en concaténant 2 fois le champs, car si il est numérique 1 fois, il le sera 2 fois
    Et du coup
    ne sera pas numérique lui.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    En interne, SQL Server utilise une routine C pour ISNUMERIC. Celle-ci accepte la notation avec le D pour les decimaux, ce qui explique ce comportement.
    C'est une grosse faiblesse de SQL server à mon sens. Il y a pas mal de fonctions de bases qui ont des comportements bizarres.
    Et il manque aussi une bonne librairie de fonctions utiles qui sont disponibles sous Oracle par exemple.
    C'est pas mal la seule frustration et mon gros reproche depuis que je suis passé d'Oracle à SQL Server.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Rien ne vous empêche de les écrire sous forme d'UDF soit en Transact SQL, soit en SQL CLR.
    Pour ma part ce qui est particulièrement pénible sous Oracle c'est l'absence totale des collations, indispensable dès que l'on a une langue non purement anglophone ! Et ne me parlez pas de NLS qui est la pire merde....

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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Effectivement, j'ai un stock de fonctions sous le coude mais bon, des fois, ce sont des bricolages vite fait qui fonctionnent très bien pour des besoins bien précis mais qui demanderaient à passer plus de temps pour les blinder vraiment.
    Et Oracle, à part pour les librairies, je ne suis pas convaincu plus que ça. D'autant que j'ai déjà débuggé des fonctions de leur librairie
    Dernière modification par al1_24 ; 05/12/2016 à 16h57. Motif: Citation superflue

  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
    Si le but est de vérifier qu'il n'y a que des chiffres dans le texte (ie, que c'est un entier écrit de façon naturelle),alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH T AS
    (
    SELECT *
      FROM ( VALUES  ( 'abcfz4343')
    			    ,('fsd')
    			    ,('323298')
    			    ,('3329D3' )
    			    ,('3329.0')
    	   ) AS V(VALUE)
    )
    SELECT VALUE
       FROM T
      WHERE VALUE NOT LIKE '%[^0-9]%'

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Ce n'est valable que pour les entiers positifs...
    Sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIKE '[-0-9]' + REPLICATE('[0-9]', LEN(MaColonne) - 1)
    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/ * * * * *

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

Discussions similaires

  1. [Batch] boucle for avec un espace dans une variable
    Par etienne72 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 28/06/2012, 17h01
  2. Réponses: 2
    Dernier message: 08/07/2011, 10h01
  3. [PHP 4] Affichage d'une image avec chemin contenu dans une variable
    Par terrysharp dans le forum Langage
    Réponses: 1
    Dernier message: 16/07/2009, 14h54
  4. [PHP 5.0] instancier une classe avec son nom dans une variable
    Par Nnay_ dans le forum Langage
    Réponses: 1
    Dernier message: 12/02/2009, 12h49
  5. Réponses: 2
    Dernier message: 19/05/2008, 13h56

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