So ändern Sie den Spaltendatentyp in der SQL-Datenbank, ohne Daten zu verlieren


198

Ich habe eine SQL Server-Datenbank und habe gerade festgestellt, dass ich den Typ einer der Spalten von intbis ändern kann bool.

Wie kann ich das tun, ohne die Daten zu verlieren, die bereits in diese Tabelle eingegeben wurden?


3
Haben Sie versucht, eine neue Bitspalte zu erstellen, die Werte aus der alten Spalte in die neue zu kopieren, die alte zu löschen und die neue umzubenennen? All dies natürlich in einer Transaktion, um Probleme zu beheben.
Radu Caprescu

2
Sie sagen: "Ich habe gerade festgestellt, dass ich den Typ von einer der Spalten von int in bool ändern kann." Es gibt keinen booleschen Datentyp. Es gibt aber etwas. Fragen Sie sich, wie Sie dies tun können (wie die beiden bisherigen Antworten gezeigt haben) ? Oder ist Ihre Frage "Ich habe gerade festgestellt, dass dies möglich ist - wie macht SQL Server das?"
Martin Smith

Antworten:


329

Sie können dies einfach mit dem folgenden Befehl tun. Jeder Wert von 0 wird in eine 0 umgewandelt (BIT = false), alles andere wird in 1 umgewandelt (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Die andere Möglichkeit besteht darin, eine neue Spalte vom Typ zu erstellen BIT, sie aus der alten Spalte zu füllen. Wenn Sie fertig sind, löschen Sie die alte Spalte und benennen Sie die neue in den alten Namen um. Auf diese Weise können Sie jederzeit zurückgehen, wenn während der Konvertierung etwas schief geht, da Sie noch über alle Daten verfügen.


10
Mit anderen Worten: NULLbleibt NULL, 0wird False, werden Werte ungleich Null (1, -1, 1999, -987 ...) True.
Álvaro González

2
Und nehmen Sie niemals eine solche Änderung über die GUI vor. Machen Sie es immer durch ein Skript wie dieses. Die GUI löscht die Tabelle und erstellt sie neu. Dies ist viel zeitaufwändiger. Wenn der Tisch groß ist und produziert wird, kann dies katastrophal sein. Außerdem sollten alle Tabellenänderungen ein Skript enthalten, das sich wie alle anderen Codes in der Quellcodeverwaltung befindet.
HLGEM

1
Ich würde hinzufügen, stellen Sie sicher, dass Sie eine aktuelle Sicherung der Datenbank haben, bevor Sie strukturelle Änderungen an einer Tabelle mit Daten vornehmen. Führen Sie während der Hauptnutzungszeiten keine solche Änderung in der Produktion durch, wenn die Tabelle häufig verwendet wird oder groß ist.
HLGEM

Ich habe die Änderungen fälschlicherweise genehmigt ... muss abgelehnt werden ... weil es dort keine Verbesserungen gibt ... Ans ist perfekt.
Vikash Pathak

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Hinweis: Wenn es eine Spaltengröße gibt, schreiben Sie einfach auch die Größe.


20

Wenn es sich um eine gültige Änderung handelt.

Sie können die Eigenschaft ändern.

Extras -> Optionen -> Designer -> Tabellen- und Datenbankdesigner -> Deaktivieren -> Speichern von Änderungen verhindern, die eine Neuerstellung der Tabelle erforderlich machten.

Jetzt können Sie den Spaltennamen einfach ändern, ohne die Tabelle neu zu erstellen oder Ihre Datensätze zu verlieren.


5
Unter keinen Umständen sollten Sie Tabellenänderungen über die GUI vornehmen. Die Tabelle wird vollständig neu erstellt, anstatt die Tabelle ändern zu verwenden. Dies führt zu einem Problem, wenn Sie diese Option deaktivieren und die Tabelle groß ist. Außerdem sollten Sie alle Änderungen an Tabellen in einem Skript in der Quellcodeverwaltung haben.
HLGEM

Schauen Sie sich diese Option genauer an - sie deaktiviert eine Sicherheit, die verhindert, dass die Benutzeroberfläche die Tabelle fallen lässt. Sie scheinen keine Daten zu verlieren, da die GUI die Tabelle neu erstellt, aber auf dem Server wird sie kopiert / gelöscht. Wenn sich also viele Daten in der Tabelle befinden, führt dies zu einer sehr großen Operation. Ich denke auch (nicht positiv), dass es in einer einzelnen Transaktion auftritt, daher könnten Sie Ihr Transaktionsprotokoll füllen.
JMarsch

1
Ich denke, ich möchte meinem vorherigen Kommentar eine kleine Klarstellung hinzufügen. Wenn Sie dies nur auf Ihrem Entwicklungscomputer tun, geht es Ihnen wahrscheinlich gut. Ich würde jedoch nicht empfehlen, diese Methode in einer Produktionsdatenbank zu verwenden - insbesondere, wenn es sich um eine geschäftskritische Methode handelt.
JMarsch

8

Warum glauben Sie, werden Sie Daten verlieren? Gehen Sie einfach in Management Studio und ändern Sie den Datentyp. Wenn der vorhandene Wert in bool (Bit) konvertiert werden kann, wird dies ausgeführt. Mit anderen Worten, wenn "1" in Ihrem ursprünglichen Feld "true" und "0" false entspricht, ist alles in Ordnung.


1
Wenn Sie Daten in der Tabelle haben, funktioniert dies nicht. Wenn Sie versuchen, einen Spaltentyp zu ändern, behauptet SMS, dass zuerst die Tabelle gelöscht werden muss ... was natürlich falsch ist, da der Befehl ALTER TABLE ... ALTER COLUMN auch für Nicht-NULL-Felder einwandfrei funktioniert. Aus diesem Grund dachten sie, sie könnten Daten verlieren.
Tony O'Hagan

1
@ TonyO'Hagan Das stimmt nicht. Sie können die Warnung deaktivieren und sie funktioniert einwandfrei mit vorhandenen Daten. Siehe auch stackoverflow.com/questions/2947865/…
Philippe Leybaert

1
OK Cool! Wusste das nicht. Ich habe gerade versucht, Sie (zurück) abzustimmen, aber SO verhindert mich, es sei denn, Sie bearbeiten Ihre Antwort. Vielleicht eine kleine Änderung und ich kann das tun;).
Tony O'Hagan

1
Unter keinen Umständen sollten Sie Tabellenänderungen über die GUI vornehmen. Die Tabelle wird vollständig neu erstellt, anstatt die Tabelle ändern zu verwenden. Dies führt zu einem Problem, wenn Sie diese Option deaktivieren und die Tabelle groß ist. Außerdem sollten Sie alle Änderungen an Tabellen in einem Skript in der Quellcodeverwaltung haben.
HLGEM

Unter keinen Umständen. Es gibt keinen Grund, die GUI jemals zum Entwerfen oder Ändern von Tabellen zu verwenden, und gute Gründe, dies nicht zu tun. Alle Änderungen müssen in Skripten enthalten sein, damit sie auf andere Server übertragen und wie der Code behandelt werden können, der sich tatsächlich in der Quellcodeverwaltung befindet.
HLGEM

5

wenn Sie T-SQL (MSSQL) verwenden; Sie sollten dieses Skript ausprobieren:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

wenn Sie MySQL verwenden; Sie sollten dieses Skript ausprobieren:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

wenn Sie Oracle verwenden; Sie sollten dieses Skript ausprobieren:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

Gehen Sie zu Tool-Option-Designer-Tabellen- und Datenbank-Designer und deaktivieren Sie die Option Speichern verhindernGeben Sie hier die Bildbeschreibung ein


1
Unter keinen Umständen sollten Sie Tabellenänderungen über die GUI vornehmen. Die Tabelle wird vollständig neu erstellt, anstatt die Tabelle ändern zu verwenden. Dies führt zu einem Problem, wenn Sie diese Option deaktivieren und die Tabelle groß ist. Außerdem sollten Sie alle Änderungen an Tabellen in einem Skript in der Quellcodeverwaltung haben.
HLGEM

2

Ändern Sie den Spaltendatentyp mit dem Prüftyp der Spalte:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

Für mich in SQL Server 2016 mache ich das so

* Um Spalte Spalte1 in Spalte2 umzubenennen

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* So ändern Sie den Spaltentyp von Zeichenfolge zu int :( Bitte stellen Sie sicher, dass die Daten im richtigen Format vorliegen. )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

In der Compact Edition wird die Größe automatisch für den Datetime-Datentyp (dh (8)) übernommen, sodass keine Feldgröße festgelegt und kein Fehler für diesen Vorgang generiert werden muss ...


-2

Ich kann den Datentyp des Tabellenfelds mit der folgenden Abfrage ändern: und auch in der Oracle-Datenbank:

ALTER TABLE table_name
MODIFY column_name datatype;

Nicht in SQl Server
HLGEM

-4

Ersetzen Sie den Datentyp, ohne Daten zu verlieren

alter table tablename modify columnn  newdatatype(size);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.