Question

J'ai une base de données SQL Server 2000 avec une colonne de type VARCHAR (255). Toutes les données sont soit NULL, ou des données numériques avec jusqu'à deux points de précision (par exemple '11 .85' ). J'ai essayé d'exécuter la requête T-SQL suivante, mais reçu l'erreur « Erreur de conversion varchar de type de données numérique »

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

J'ai essayé un casting plus précis, qui a également échoué.

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

J'ai aussi essayé ce qui suit pour voir si des données sont non-numérique, et les seules valeurs renvoyées étaient NULL.

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

J'ai essayé de se convertir à d'autres types de données, tels que FLOAT et de l'argent, mais seulement l'argent a réussi. J'ai donc essayé les éléments suivants:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

... qui fonctionnait très bien. Toutes les idées pourquoi la requête initiale a échoué? Y aura-t un problème si je suis convertir à l'argent et à DECIMAL?

Merci!

Était-ce utile?

La solution

Il est probable que cela dépend du fait que le symbole décimal est une virgule ou un point. Voici quelques requêtes de test et leurs résultats:

select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1

La documentation ISNUMERIC dit:

  

ISNUMERIC renvoie 1 lorsque l'entrée   expression évalue à un valide   entier, nombre à virgule flottante, l'argent   ou de type décimal; sinon il retourne   0

Les deux 3.6 et 3,6 peuvent être coulés à money, de sorte que le rendement est pourquoi isnumeric('3,6') 1.

Pour résoudre ce problème, remplacez les années avec des points virgules (ou vice-versa, si votre système utilise la virgule comme le symbole décimal):

select cast(replace('3,6',',','.') as decimal)

Une autre option est de changer le « symbole décimal » dans Windows. Il est dans le Panneau de configuration -> régionales et linguistiques -> Formats -> Paramètres supplémentaires -.> Numbers

Autres conseils

Une autre cause est des chaînes vides. Par exemple, si vous utilisez l'assistant d'importation pour importer un fichier CSV, les champs vides deviendront des chaînes vides, pas les valeurs NULL.

Ceci est un idiome commun pour fixer ceci:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

Sélectionnez CAST (isnull (MaColonne, 0) comme décimal (4,2)) DE [MyTable];

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top