2011-02-03 36 views
21

Necesito seleccionar de una columna del tipo de datos float e insertarlo en otra columna como nvarchar.¿emitir o convertir un flotador a nvarchar?

Me trataron de echarlo: cast([Column_Name] as nvarchar(50))

El resultado fue 9.07235e+009 en lugar de un número de 10 dígitos (número telefónico).

¿Alguien sabe cómo convertir o convertir estos datos correctamente?

+6

Aunque un número de teléfono es un tipo de 'número', una regla general es SÓLO almacenar cosas como números si está planeando hacer algún tipo de cálculo con ellos. Si el número que intenta almacenar nunca va a necesitar ninguna manipulación (con la excepción de una actualización o algo similar), debe almacenarlos como una cadena de algún tipo. – syllogism

Respuesta

14

Si está almacenando números de teléfono en una columna de tipo flotante (lo cual es una mala idea), se supone que son todos enteros y podrían convertirse a int antes de enviarlos a nvarchar.

Así que en lugar de:

select cast(cast(1234567890 as float) as nvarchar(50)) 
1.23457e+009 

Se podría utilizar:

select cast(cast(cast(1234567890 as float) as int) as nvarchar(50)) 
1234567890 

En estos ejemplos, el más interno cast(1234567890 as float) se utiliza en lugar de seleccionar un valor de la columna correspondiente.

¡Realmente recomiendo que no almacene números de teléfono en flotadores!
¿Qué pasa si el número de teléfono comienza con un cero?

select cast(0100884555 as float) 
100884555 

¡Vaya! Acabamos de guardar un número de teléfono incorrecto ...

+0

Desbordamiento aritmético – RichardTheKiwi

+0

Cierto, pero siempre puede usar bigint si tiene números de teléfono superiores a 4 mil millones. En cualquier caso, la función STR parece una mejor opción que yo no conocía antes de esta pregunta. – Coxy

+0

En América del Norte, los números de teléfono nunca comienzan con 0. ¡Pero el error de redondeo todavía sería un problema! – dan04

30

Verificar STR. Necesita algo como SELECT STR([Column_Name],10,0) ** Esta es la solución de SQL Server, para que otros servidores verifiquen sus documentos.

+0

Gracias a1ex07 funciona – Eugene

+5

Si fue de ayuda, esperaría "+"/mejor respuesta de usted :) – a1ex07

+3

NOTA: STR causa espacios iniciales. Ej .: SELECCIONAR 'A' + STR (123.0,10,0) + 'B' da la cadena "A 123B". Debe usar LTRIM o CONVERTIR a decimal primero. – PMBjornerud

7

No utilice use flotadores para almacenar datos de punto fijo, de precisión requerida. Este ejemplo muestra cómo convertir un flotador a NVARCHAR (50) correctamente, al tiempo que muestra por qué es una mala idea usar flotantes para datos de precisión.

create table #f ([Column_Name] float) 
insert #f select 9072351234 
insert #f select 907235123400000000000 

select 
    cast([Column_Name] as nvarchar(50)), 
    --cast([Column_Name] as int), Arithmetic overflow 
    --cast([Column_Name] as bigint), Arithmetic overflow 
    CAST(LTRIM(STR([Column_Name],50)) AS NVARCHAR(50)) 
from #f 

salida

9.07235e+009 9072351234 
9.07235e+020 907235123400000010000 

Usted puede notar que la segunda salida termina con '10000' a pesar de que los datos que tratamos de almacenar en la tabla termina con '00000'. Es porque el tipo de datos float tiene un número fijo de cifras significativas admitidas, que no se extiende tan lejos.

-1

DECLARE @MyFloat [flotador]

SET @MyFloat = 1,000,109,360.050

SELECT REPLACE (RTRIM (REEMPLAZAR (REPLACE (RTRIM ((REPLACE (CAST (CAST (@MyFloat como un decimal (38, 18)) COMO VARCHAR (max)), '0', ''))), '', '0'), '.', '')), '', '.')

Cuestiones relacionadas