SQL IsNumeric ne fonctionne pas
La réserve de la colonne est une colonne de type varchar, pour effectuer sommes sur lui, je veux la convertir en une deciaml.
Mais le SQL ci-dessous me donne une erreur
select
cast(Reserve as decimal)
from MyReserves
Erreur de conversion de type de données varchar numérique.
J'ai ajouté le isnumeric et non pas la valeur null pour éviter cette erreur, mais il persiste encore, des idées pourquoi?
select
cast(Reserve as decimal)
from MyReserves
where isnumeric(Reserve ) = 1
and MyReserves is not null
- Pouvez-vous montrer quelques données dans la Réserve de la colonne ?
- Vous devez être prudent avec isnumeric, comme il peut retourner des résultats incorrects. C'est à partir de la documentation **ISNUMERIC retourne 1 pour certains caractères qui ne sont pas des numéros, comme le signe plus (+), moins (-), et valide les symboles monétaires tels que le signe dollar ($). ** Avoir un coup d'oeil à stackoverflow.com/questions/312054/...
- il ne veut pas retourner des résultats incorrects. C'est juste que la plupart des gens n'apprécient pas qu'il répond à une question que personne n'a jamais, en fait, veut demander ("cette chaîne convertir pour au moins l'un des types numériques?")
- Vous semblez être en supposant que le
cast
va se passer après lawhere
. Ce n'est absolument pas garanti dans tous les cas, indépendamment des limitations deisnumeric
- Je pense que vous devriez ajouter cela comme une réponse
- La raison pour laquelle je ne l'ai pas, c'est parce qu'il y a déjà beaucoup de dupes pour ce cas. l'exemple De ce one
Vous devez vous connecter pour publier un commentaire.
Il semble que isnumeric a quelques Problèmes:
http://www.sqlhacks.com/Retrieve/Isnumeric-problems
(via internet archive)
Selon ce Lien, vous pouvez le résoudre comme ça:
Voir ici: FONTE et IsNumeric
Essayez ceci:
Mise à JOUR
Par défaut de la décimale est (18,0), de sorte
Gosh, personne ne semble avoir expliqué correctement. SQL est un langage descriptif. Il ne précise pas l'ordre des opérations.
Le problème que vous (bien, été) est que les
where
ne fait pas de filtrage avant la conversion a lieu. Ordre des opérations, cependant, est garanti pour une instruction case. Donc, le travail:La question n'a rien à voir avec le numérique particulière format de la conversion ou à l'
isnumeric()
fonction. C'est simplement que l'ordre des opérations n'est pas garanti.Utilisation try_cast sql (2012)
isnumeric
n'est pas fiable à 100% dans SQL - voir cette question Pourquoi ne ISNUMERIC('.') retour 1?Je suppose que vous avez de la valeur dans la réserve de la colonne qui passe par le
isnumeric
test, mais ne sera pas jeté à la décimale.Juste un heads-up sur isnumeric; si la chaîne contient des nombres et d'un " E " suivi de quelques numéros, elle est considérée comme un exposant. Exemple, sélectionnez isnumeric('123E0') renvoie 1.
J'ai eu ce même problème et il s'est avéré être la notation scientifique comme "1.72918 E-13" Pour trouver ce juste faire où les Réserves LIKE '%E%'. Essayez d'ignorer et de voir si cela fonctionne. Vous aurez à écrire le code pour le transformer en quelque chose d'utilisable ou de reformater votre fichier source afin de ne pas mettre un numéro en utilisant la notation scientifique.
IsNumeric est un problème de l'enfant -- SQL 2012 et plus tard a TRY_CAST et TRY_CONVERT
Si vous êtes sur une version antérieure, alors vous pouvez écrire une fonction qui va convertir en décimal (ou NULL si elle ne peut pas convertir). Il utilise le XML des fonctions de conversion qui ne jetez pas les erreurs lorsque le nombre ne tient pas 😉
Alors il suffit de changer votre requête à:
IsNumeric
est peut-être pas l'idéal dans votre scénario à partir de la Note en surbrillance sur ce Page MSDN il dit "ISNUMERIC retourne 1 pour certains caractères qui ne sont pas des numéros, comme le signe plus (+), moins (-), et valide les symboles monétaires tels que le signe dollar ($)."Il y a aussi un article de nice ici qui évoque plus
ISNUMERIC
.Essayer (pour exemple):
Numérique/Décimal veulent généralement une précision de l'échelle.
Je suis également confronté à ce problème et je l'ai résolu par la méthode ci-dessous. Je partage car il peut utile à quelqu'un.