web-dev-qa-db-fra.com

tSQL - Conversion de varchar en travail numérique pour tout sauf l'entier

J'ai une table avec des nombres dans un champ varchar(255). Ils sont tous supérieurs à un et ont plusieurs décimales. Je voudrais les convertir en nombres entiers. Selon chaque site Web que j'ai consulté, y compris celui-ci sur StackOverflow , l'un ou l'autre devrait fonctionner:

SELECT CAST(VarcharCol AS INT) FROM MyTable

SELECT CONVERT(INT, VarcharCol) FROM MyTable

Ces deux fonctionnent pour moi pour chaque type de valeur numérique, mais integer - Je peux convertir en float, decimal, etc. très bien, mais essayer de convertir en integer me donne l'erreur suivante:

Conversion failed when converting the varchar value '7082.7758172' 
to data type int.

J'ai résolu le problème en convertissant le type de données Decimal(6,0), ce qui fonctionne bien. Mais juste pour mes études, quelqu'un peut-il me dire pourquoi la conversion en type de données int (ou integer) me cause une erreur? Merci.

7
Stanton

La conversion d'une valeur VARCHAR en un INT échoue lorsqu'il existe des chiffres à droite de la décimale pour éviter la perte de données.

Si vous convertissez d'abord en FLOAT, puis en INT, la conversion fonctionne.

SELECT CAST(CAST('7082.7758172' as float) as int)

résultats

7082
13
Max Vernon

En réalité, qu’il y ait des chiffres ou non n’a aucune importance. Le . (point) est interdit si vous voulez utiliser int. Dot ne peut pas - logiquement - faire partie de la définition Integer, alors même:

select cast ('7.0' as int)
select cast ('7.' as int)

échouera mais les deux conviennent pour les flotteurs.

2
nimdil

Essaye ça

declare @v varchar(20)
set @v = 'Number'
select case when isnumeric(@v) = 1 then @v
else @v end

et

declare @v varchar(20)
set @v = '7082.7758172'
select case when isnumeric(@v) = 1 then @v
else convert(numeric(18,0),@v) end
0
Gayathri L