2011-02-03 12 views
21

Devo selezionare da una colonna del tipo di dati float e inserirlo in un'altra colonna come nvarchar.lanciare o convertire un float in nvarchar?

ho cercato di lanciarlo: cast([Column_Name] as nvarchar(50))

Il risultato è stato 9.07235e+009 invece di un 10 cifre (numero di telefono).

Qualcuno sa come eseguire correttamente il cast o convertire questi dati?

+6

Anche se un numero di telefono è un tipo di 'numero', una regola generale è di memorizzare SOLO le cose come numeri se si prevede di fare qualche tipo di calcolo con loro. Se il numero che si intende archiviare non avrà mai bisogno di alcuna manipolazione (ad eccezione di un aggiornamento o qualcosa del genere), dovresti memorizzarli come una stringa di qualche tipo. – syllogism

risposta

14

Se si memorizzano i numeri di telefono in una colonna flottata (che è una cattiva idea), sono presumibilmente tutti interi e potrebbero essere convertiti in int prima di eseguire il cast su nvarchar.

Così, invece di:

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

Si potrebbe utilizzare:

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

In questi esempi il più interno cast(1234567890 as float) viene usato al posto di selezione di un valore dalla colonna appropriata.

Mi raccomando davvero che non si memorizzano i numeri di telefono in floats però!
Cosa succede se il numero di telefono inizia con uno zero?

select cast(0100884555 as float) 
100884555 

Whoops! Abbiamo appena memorizzato un numero di telefono errato ...

+0

Overflow aritmetico – RichardTheKiwi

+0

Abbastanza vero, ma è sempre possibile utilizzare bigint se si dispone di numeri di telefono superiori a 4 miliardi. In ogni caso, la funzione STR sembra un'opzione migliore che non conoscevo prima di questa domanda! – Coxy

+0

In Nord America, i numeri di telefono non iniziano mai con 0. Ma l'errore di arrotondamento sarebbe ancora un problema! – dan04

30

Controllare STR. Hai bisogno di qualcosa come SELECT STR([Column_Name],10,0) ** Questa è la soluzione di SQL Server, per gli altri server controllare i loro documenti.

+0

Grazie a1ex07 funziona – Eugene

+5

Se è stato utile, mi sarei aspettato "+"/migliore risposta da parte tua :) – a1ex07

+3

NOTA: STR causa spazi iniziali. Es: SELEZIONA 'A' + STR (123.0,10,0) + 'B' dà la stringa "A 123B". Deve utilizzare prima LTRIM o CONVERT in decimale. – PMBjornerud

7

Do not utilizzare i galleggianti per memorizzare dati a precisione fissa e dati obbligatori. Questo esempio mostra come convertire correttamente un float in NVARCHAR (50), mostrando anche il motivo per cui è una cattiva idea usare i float per i dati di precisione.

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 

uscita

9.07235e+009 9072351234 
9.07235e+020 907235123400000010000 

Si può notare che il 2 ° uscita si conclude con '10000' anche se i dati che abbiamo cercato di memorizzare nella tabella si conclude con '00000'. È perché il tipo di dati float ha un numero fisso di cifre significative supportate, che non si estende fino a questo punto.

-1

DECLARE @MyFloat [float]

SET @MyFloat = 1000109360,050

SELEZIONE SOSTITUZIONE (RTRIM (replace '(sostituite (RTRIM ((SOSTITUIRE (CAST (CAST (@MyFloat decimale (38, 18)) AS VARCHAR (max)), '0', ''))), '', '0'), '.', '')), '', '.')

Problemi correlati