2010-04-23 12 views
38

Ist es möglich, einen Spaltentyp in einer SQL Server 2008-Datenbank von varchar(255) zu varchar(MAX) zu ändern, ohne die Tabelle löschen und neu erstellen zu müssen?Varchar (255) zu Varchar (MAX)

SQL Server Management Studio wirft mir jedes Mal einen Fehler, wenn ich versuche, dies zu tun - aber um mich zu retten Kopfschmerzen wäre schön zu wissen, ob ich den Typ ändern kann, ohne DROP und CREATE.

Dank

+2

Seltsam, versuchte es in SQL Server 2005, funktioniert gut für mich. – anonymous

+2

BTW, was war der Fehler? – anonymous

+1

'Änderungen speichern ist nicht erlaubt. Die Änderungen, die Sie vorgenommen haben, erfordern, dass die folgenden Tabellen gelöscht und neu erstellt werden. Sie haben entweder Änderungen an einer Tabelle vorgenommen, die nicht erneut erstellt werden kann, oder die Option "Änderungen speichern, für die eine Tabelle neu erstellt werden muss" aktiviert. Option ‚Verhindern, dass die Änderungen zu speichern‘ ist nicht aktiviert ... – Darbio

Antwort

66

sollten Sie in der Lage sein, es TSQL mit zu tun.

So etwas wie

ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX) 
+0

das hat funktioniert. danke – Darbio

+0

für mich auch hat es mir geholfen ... danke –

11

‚Änderungen Speichern ist nicht gestattet. Die von Ihnen vorgenommenen Änderungen erfordern, dass die folgenden Tabellen gelöscht und neu erstellt werden. Sie haben entweder Änderungen an einer Tabelle vorgenommen, die nicht neu erstellt werden kann, oder die Option verhindern Speichern von Änderungen, die Tabelle erfordert, neu erstellt werden. ' Option 'Prevent Speichern der Änderungen' nicht aktiviert ..

Das ist ein neues "Feature" in SQL Server Management Studio 2008, die standardmäßig aktiviert ist. Immer wenn Sie eine größere Änderung vornehmen, kann SSMS die Tabelle nur neu erstellen, indem Sie eine neue erstellen und dann die Daten aus der alten verschieben - alles im Hintergrund (diese Änderungen umfassen unter anderem die Neuordnung Ihrer Spalten).

Diese Option ist standardmäßig deaktiviert, da diese Tabelle möglicherweise fehlschlägt, wenn Ihre Tabelle FK-Einschränkungen und -Stuffs enthält. Aber Sie können dieses Feature definitiv einschalten!

alt text http://i42.tinypic.com/19pegj.png

Es ist unter Tools > Options und wenn Sie diese Option deaktivieren können Sie diese Art von Änderungen an Tabellenstruktur in der Tabelle Designer wieder tun.

+0

Danke marc_s. Ich hatte dies bereits nicht angekreuzt und es hinderte mich immer noch daran, die Änderungen vorzunehmen. Die alter statements von astander funktionierten, als ich sie selbst schrieb. Danke :) – Darbio

+0

@JD: hmm ... seltsam ... normalerweise ist das das Problem - froh, dass du bereits eine Lösung hast! –

1

Beachten Sie
mit so etwas wie

ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX) 

https://dba.stackexchange.com/questions/15007/change-length-of-varchar-on-live-prod-table

Martin Smith Answare:

Wenn Sie es varchar(100 - 8000) (dh etwas anderes als varchar(max)) steigen und Sie tun dies, durch TSQL anstelle der SSMS-GUI

ALTER TABLE YourTable ALTER COLUMN YourCol varchar(200) [NOT] NULL
und keine Spaltennullability von ändern NULL bis NOT NULL (was die Tabelle sperren würde, während alle Zeilen validiert sind und potentiell in oder von NOT NULL bis NULL geschrieben wurden, dann ist dies eine schnelle Änderung nur der Metadaten. Es muss möglicherweise auf eine SCH-M Sperre auf dem Tisch warten, aber sobald es erwirbt, wird die Änderung ziemlich sofort sein. Ein Nachteil zu beachten ist, dass während der Wartezeit für eine SCH-M Sperre andere Abfragen blockiert werden, anstatt die Warteschlange vor ihm zu springen, so dass Sie möglicherweise in Erwägung ziehen, zuerst eine SET LOCK_TIMEOUT hinzufügen. Stellen Sie außerdem sicher, dass Sie in der ALTER TABLE Anweisung explizit NOT NULL angeben, wenn dies der ursprüngliche Spaltenstatus ist, da andernfalls die Spalte geändert wird, um NULL zuzulassen.

+0

Ist das nicht identisch mit [dieser bestehenden Antwort] (http://stackoverflow.com/a/2696003/1402846)? – Pang

+1

Warum ist es ein Problem, ALTER zu VARCHAR (MAX)? – Chris