51 Stimmen

Wie ändert man eine Spalte, ohne eine Tabelle in SQL 2008 zu löschen?

Warum will SQL 2008 plötzlich meine Tabellen löschen, wenn ich den Spaltentyp z. B. von int in real ändere? Meines Wissens ist dies in SQL 2005 nie passiert. Jeder Einblick wäre hilfreich.

58voto

Johannes Rudolph Punkte 34512

Ich kann nicht glauben, dass die oberste Antwort schon so lange hier liegt - es ist ein sehr gefährlicher Ratschlag!

Es gibt nur wenige Operationen, die Sie an Ort und Stelle durchführen können, ohne Ihre Tabelle zu löschen:

Wenn Sie sich in einer Situation befinden, in der die Änderung einer Spalte nicht möglich ist, ohne die Tabelle zu löschen, können Sie normalerweise eine SELECT INTO Abfrage, um Ihre Daten in eine neue Tabelle zu projizieren, dann löschen Sie die alte Tabelle (und deaktivieren vorübergehend die Beschränkungen) und benennen dann die projizierte Tabelle um. In diesem Fall müssen Sie allerdings Ihre Datenbank zur Wartung offline nehmen.

44voto

Marcos Buarque Punkte 3248

In SQL Server 2008 gehen Sie zu Extras >> Optionen. In dem kleinen Fenster klicken Sie auf "Designer". Deaktivieren Sie das Kontrollkästchen "Speichern von Änderungen verhindern, die ...".

\=====

Bearbeitet am 4. September 2015.

Ich habe diese Antwort hier vor langer, langer Zeit hinzugefügt und beschrieben, wie ich die in der obigen Frage beschriebene Situation lösen würde. Seitdem haben Benutzer in den folgenden Threads verschiedene Bedenken bezüglich der von mir damals empfohlenen Vorgehensweise geäußert. Im Grunde genommen könnte die von mir beschriebene Lösung in einigen Fällen problematisch sein. Ich empfehle Ihnen daher, weiterzulesen, die Kommentare anderer Benutzer zu lesen und die für Sie beste Lösung zu wählen.

44voto

user2173353 Punkte 4062

Das verwende ich:

-- Add new column
ALTER TABLE MyTable
ADD Description2 VARCHAR(MAX)
GO

-- Copy data to new column (probably with modifications)
Update MyTable
SET Description2 = Description
GO

-- Drop old column
ALTER TABLE MyTable
DROP COLUMN Description
GO

-- Rename new column to the original column's name.
sp_RENAME 'MyTable.Description2' , 'Description', 'COLUMN'
GO
  1. Kopieren Sie die Daten in eine neue Spalte.
  2. Lassen Sie die alte Spalte fallen.
  3. Benennen Sie die neue Spalte in den Namen der alten Spalte um.

0voto

Ich habe das gleiche Problem. Obwohl mein Konto sa-Rechte hat, funktioniert es, wenn ich ein anderes sa-Konto verwende. Es scheint, dass mein Konto irgendwie nicht die Fähigkeit, zu ändern haben. noch untersuchen, aber es ist eine Berechtigung Problem.

aktualisieren:

Ich kann es nicht erklären, aber ich habe Folgendes getan: Es gab zwei Domänengruppen, zu denen mein Konto gehörte. Die eine war eine neue AD-Domänengruppe und die andere war eine NT-Legay-Domänengruppe. Nachdem ich die Legacy-Domänengruppe entfernt hatte, konnte ich die Tabelle erfolgreich ändern. Wohlgemerkt, beide Gruppen hatten "sa"-Privilegien.

Das Verhalten war so, dass die alter-Befehle zum Erfolg führten, sich aber nichts an der Tabelle änderte. Als ich dann versuchte, die Felder manuell über den Designer zu ändern, beschwerte er sich, dass ich keine Änderungen vornehmen dürfe, wenn ich die Tabelle löschen und neu erstellen müsse. Ich fand die Einstellung in den Werkzeugen und konnte sie deaktivieren. Aber diese Tabelle ist riesig und es ist keine gute Idee, dies zu tun. Ich würde anderen davon abraten.

Es war also eine Frage der Genehmigung. Ich kann nicht erklären, wie, aber ich hoffe, es hilft jemand anderem

0voto

Eine andere Möglichkeit, ohne die Tabelle vollständig zu löschen, ist

  1. Erstellen Sie eine Sicherungskopie der Spaltenwerte.

  2. Machen Sie die Spalte nullbar, wenn sie nicht bereits Nullen zulässt. Setzen Sie die Spaltenwerte auf null, indem Sie tun.

    update tablename set columnname = null 
  3. Löschen Sie die Spalte

  4. Fügen Sie eine neue Spalte mit demselben Namen wie die gelöschte Spalte und dem gewünschten Typ ein

  5. Einfügen der gespeicherten Daten in diese Spalte

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X