2015-08-12 10 views
5

Ich versuche, den Datentyp in einer Spalte in einer Tabelle von Float (null) zu Varchar(25) (null) zu ändern. Der größte Float in den aktuellen Daten ist 12 Ziffern, aber möglicherweise müssen in Zukunft weitere Ziffern hinzugefügt werden, daher varchar(25).SQL Converting Spaltentyp von float zu varchar

Die aktuellen Daten in der Spalte sind Telefonnummern. Die Änderung muss vorgenommen werden, um vorausgehende Nullen zu ermöglichen.

Allerdings habe ich einige Schwierigkeiten dabei.

Ich habe versucht, die folgenden:

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25) 

Dies gibt mir nicht das gewünschte Ergebnis.

Zum Beispiel 1549779498 wird 1.54978e+009

Dann habe ich versucht, etwas in den Zeilen dieses:

  • eine neue (temporäre) Spalte Erstellen PhonenumberVarchar
  • Konvertieren und Kopieren der Daten aus einer Spalte zu einem anderen
  • Löschen der alten Spalte
  • Umbenennung der neuen Spalte in den alten Namen

Code:

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' 

Das funktioniert auch nicht:

Unterabfrage gab mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, < =,>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird.

Und jetzt ist es zu spät und mein Kopf tut weh ...

Kann jemand helfen?

HINWEIS:

Der Tisch ist ziemlich groß, etwa 1,5 Millionen Zeilen, so kann die Leistung ein Problem sein.

Verwenden von SQL Server.

Antwort

3

Sie können dieses Problem beheben, indem sie durch eine decimal ersten gehen:

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

Sie das gleiche Verhalten erhalten, wenn cast() mit:

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

So das Update dargestellt durch:

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

Die documentation für alter table alter column explizit Referenzen cast():

Einige Datentypänderungen können zu einer Änderung der Daten führen. Beispiel: Wenn Sie eine nchar- oder nvarchar-Spalte in char oder varchar ändern, kann dies die -Konvertierung von erweiterten Zeichen zur Folge haben. Weitere Informationen finden Sie unter CAST und CONVERT (Transact-SQL). Die Reduzierung der Genauigkeit oder Skalierung einer -Spalte kann zu Datenabschneidung führen.

EDIT:

Nachdem Sie die Daten laden, würde ich vorschlagen, dass Sie auch eine Check-Einschränkung hinzufügen:

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

Dadurch wird sichergestellt, dass die Zahlen - und nur Zahlen - bleiben in die Spalte in der Zukunft.

+0

Dies scheint zu funktionieren. Also, wenn ich richtig verstehe, ist der Trick mit der Dezimalumwandlung zuerst, um sicherzustellen, dass die Rundungsfehler, die ich direkt mit nvarchar bekommen habe, eliminiert werden? – user2110298

+1

@ user2110298. . . Ja, obwohl ich mir nicht sicher bin, ob es sich um Rundungsfehler handelt. Die für die Konvertierung verwendete Darstellung ist nicht das, was Sie möchten, und dies ist ein relativ einfacher Weg, um dieses Problem zu lösen. –

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

Mit diesem Code wird weiterhin der beschriebene Fehler im ursprünglichen Post angezeigt. – user2110298