2015-08-12 4 views
5

Sto provando a modificare il tipo di dati in una colonna in una tabella da Float (null) a Varchar(25) (null). Il più grande float nei dati correnti è di 12 cifre, ma potrebbe essere necessario aggiungere più cifre in futuro, quindi varchar(25).Conversione SQL tipo di colonna da float a varchar

I dati correnti nella colonna sono numeri di telefono. La modifica deve essere fatta per consentire gli zeri precedenti.

Tuttavia, sto avendo qualche difficoltà a farlo.

ho provato la seguente:

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25) 

Questo non mi dà il risultato desiderato.

Per esempio 1549779498 diventa 1.54978e+009

qualcosa, allora ho provato nelle linee di questo:

  • Creazione di una nuova colonna (temporanea) PhonenumberVarchar
  • Conversione e copiando i dati da una colonna a un altro
  • Eliminazione della colonna precedente
  • Ridenominazione della nuova colonna con il vecchio nome

Codice:

ALTER TABLE Customer 
ADD PhonenumberVarchar varchar(25) 

UPDATE Customer 
SET PhonenumberVarchar = STR(Phonenumber, 12, 0) 

ALTER TABLE Customer 
DROP COLUMN Phonenumber 

EXEC sp_rename 'Customer.PhonenumberVarchar', 'Phonenumber', 'COLUMN' 

questo non funziona neanche:

subquery ha restituito più 1 valore. Ciò non è consentito quando la sottoquery segue =,! =, <, < =,>,> = o quando la sottoquery viene utilizzata come espressione.

E ora è tardi e la mia testa fa male ...

chiunque può aiutare?

NOTA:

Il tavolo è piuttosto grande, circa 1,5 milioni di righe, quindi le prestazioni può essere un problema.

Utilizzo di SQL Server.

risposta

3

È possibile risolvere questo passando attraverso un primo decimal:

ALTER TABLE Customer ALTER COLUMN Phonenumber decimal(25, 0); 
ALTER TABLE Customer ALTER COLUMN Phonenumber varchar(25); 

si ottiene lo stesso comportamento quando si utilizza cast():

select cast(cast(1549779498 as float) as varchar(255)) 

Quindi la correzione è illustrato da:

select cast(cast(cast(1549779498 as float) as decimal(25)) as varchar(255)) 

documentation per alter table alter column riferimenti espliciti cast():

Alcune modifiche al tipo di dati possono causare una modifica dei dati. Ad esempio, cambiando una colonna nchar o nvarchar in char o varchar può causare la conversione di caratteri estesi. Per ulteriori informazioni, vedere CAST e CONVERT (Transact-SQL). La riduzione della precisione o della scala di una colonna può causare il troncamento dei dati.

EDIT:

Dopo aver caricato i dati, vorrei suggerire che anche si aggiunge un vincolo di controllo:

check (PhoneNumber not like '%[^0-9]%') 

Questo farà sì che i numeri - e solo i numeri - restano in la colonna in futuro.

+0

Questo sembra funzionare. Quindi, se capisco correttamente il trucco con la conversione decimale prima è quello di assicurarsi che gli errori di arrotondamento che ho ottenuto utilizzando direttamente nvarchar siano eliminati? – user2110298

+1

@ user2110298. . . Sì, anche se non sono sicuro che siano esattamente errori di arrotondamento. La rappresentazione utilizzata per la conversione non è ciò che desideri e questo è un modo relativamente semplice per risolvere questo problema. –

0
ALTER TABLE Customer ADD PhonenumberVarchar VARCHAR(25) 

GO 

UPDATE Customer SET PhonenumberVarchar = str (Phonenumber,12,0) 

ALTER TABLE Phonenumber ALTER COLUMN Phonenumber VARCHAR(25) 

UPDATE Customer SET Phonenumber = PhonenumberVarchar 

ALTER TABLE Customer DROP COLUMN PhonenumberVarchar 
+0

L'utilizzo di questo codice ottiene ancora l'errore descritto nel post originale. – user2110298