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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé
    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
    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
    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 confirmé
    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
    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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    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

+ 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