2012-05-18 10 views
10

Ich habe eine Spalte, die meiner Meinung nach falsch deklariert wurde. Es enthält Daten und ich möchte nicht die Daten verlieren.Ändern eines Spaltentyps mit Daten, ohne die Daten zu löschen

Ich möchte die Definition von Varchar (max) zu Varchar (eine ganze Zahl) ändern. Ich hatte den Eindruck, dass ich den Säulentyp nicht einfach ändern kann?

Ist die beste Methode, um eine temporäre Spalte zu erstellen, "Spalte2", übertragen Sie die Daten in diese Spalte, aus der Spalte mit dem problematischen Typ, löschen Sie die Problemspalte und benennen Sie dann die temporäre Spalte in die ursprüngliche problematische Spalte?

Wenn ja, wie kopiere ich die Werte aus der Problemspalte in die neue Spalte?

EDIT: Für jeden mit demselben Problem, Sie können nur die ALTER-Anweisungen verwenden.

Antwort

16

Solange die Datentypen etwas "verwandt" sind - ja, können Sie das absolut tun.

Sie können eine INT in eine BIGINT ändern - der Wertebereich des zweiten Typs ist größer, so dass Sie nicht Gefahr laufen, Daten zu verlieren.

Sie können eine VARCHAR(50) in eine VARCHAR(200) ändern - wieder sind die Typen kompatibel, die Größe wird größer - kein Risiko, irgendetwas abzukürzen.

Grundsätzlich brauchen Sie nur

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 

oder was auch immer. Solange Sie keine Zeichenfolge länger als diese 200 Zeichen haben, wird es Ihnen gut gehen. Nicht sicher, was passiert, wenn Sie längere Strings haben - entweder wird die Konvertierung mit einem Fehler fehlschlagen, oder es wird weitergehen und Ihnen sagen, dass einige Daten abgeschnitten wurden. Deshalb schlage ich vor Ihnen zuerst versuchen, diese auf einer Kopie Ihre Daten :-)

Es wird ein bisschen schwieriger, wenn Sie ein VARCHAR zu einem INT oder so etwas ändern müssen - natürlich, wenn Sie Spaltenwerte haben, die passen Sie nicht in den neuen Typ, die Konvertierung wird fehlschlagen. Aber selbst die Verwendung einer separaten "temporären" neuen Spalte wird das nicht beheben - Sie müssen sich irgendwie mit diesen "nicht kompatiblen" Fällen befassen (ignorieren Sie sie, belassen Sie NULL dort, setzen Sie sie auf einen Standardwert - etwas). Die Umschaltung zwischen VARCHAR und NVARCHAR kann schwierig werden, wenn Sie z. Nicht-westeuropäische Zeichen - Sie könnten bei der Konvertierung bestimmte Einträge verlieren, da sie nicht im anderen Format dargestellt werden können, oder die "Standard" -Umsetzung von einem Typ in den anderen nicht wie erwartet funktioniert.

+1

Funktioniert für 'CHAR' zu' VARCHAR' und schneidet sogar die Polsterung. –

+0

Ich habe Probleme beim Wechsel von VARCHAR zu TEXT, irgendwelche Ideen? – Murilo

+1

@Murilo: Da 'TEXT' bereits ** veraltet ** ist und sehr bald entfernt wird, würde ich ** NICHT ** eine Spalte * in * Datentyp' TEXT' ändern - stattdessen 'VARCHAR (MAX)' verwenden, wenn Sie brauchen wirklich mehr als 8000 Zeichen von Daten –

0

fügen Sie eine temporäre Spalte mit dem Typ varchar (NN) hinzu, führen Sie update tbl set column2 = column aus, überprüfen Sie, ob ein Fehler auftritt; Wenn alles in Ordnung ist, ändern Sie Ihre ursprüngliche Spalte, kopieren Sie Daten zurück und entfernen Sie Spalte2.

1

Berechnen Sie den maximalen Datenlängenspeicher in dieser Spalte dieser Tabelle.

Jetzt können Sie die Größe dieser Spalte bis zum Ergebnis in der vorherigen Abfrage verringern.

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 
+0

Ist dieser erste Schritt notwendig, wenn Sie sich das SCHEMA der Tabelle ansehen? –

+0

Sie möchten ein Varchar-Feld verkleinern, also sollte dies der erste Schritt sein. –

+1

Ich entschuldige mich. Ich habe falsch gelesen und gedacht, dass er expandiert, nicht schrumpft. –

Verwandte Themen