2009-12-02 12 views
7

Ich möchte eine Spalte in SQL Server vom Typ Int, um Text einzugeben, während der Spaltenname beibehalten. Die Tabelle mit dieser Spalte enthält viele Daten, und ich möchte sie nicht verlieren. SQL Server scheint implizite oder explizite Umwandlungen von int zu Text nicht zu unterstützen, sonst wäre das ziemlich einfach. Also, wie würdest du es nur mit SQL machen?In SQL Server ändern Spalte des Typs Int, um Text

+0

'Text' oder 'Varchar'? –

+1

Es gibt ein paar Antworten, die Sie durch Ihr Problem bringen sollten, aber ich möchte nur hinzufügen, dass der TEXT-Datentyp viele "gotchas" hat. Sie sind fast sicher besser dran mit VARCHAR (MAX) oder NVARCHAR (MAX) unter der Annahme, dass Sie bei SQL 2005 oder später. Wenn nicht, sollten Sie stattdessen einen sehr großen VARCHAR oder NVARCHAR verwenden. –

+0

einen bestimmten Grund für Text anstelle von Nvarchar (max)? – DForck42

Antwort

7

Da MS SQL Server (wie die meisten Datenbanken) keine direkte Änderung des Typs einer vorhandenen Spalte unterstützt, müssen Sie dies in Schritten tun. Die Art, wie ich Probleme wie diese in der Vergangenheit gelöst haben wird (Tisch unter der Annahme ‚foo‘ genannt und Ihre Spalte ‚bar‘ genannt):

ALTER TABLE foo ADD COLUMN tempbar text; 
UPDATE foo SET tempbar = cast(cast(bar as varchar) as text); 
ALTER TABLE foo DROP COLUMN bar; 
ALTER TABLE foo ADD COLUMN bar text; 
UPDATE foo SET bar = tempbar; 
ALTER TABLE foo DROP COLUMN tempbar; 

(Ein Teil der SQL-Syntax aus sein kann, es ist schon ein Jahr, seit ich das letzte Mal in einem anderen Job gemacht habe, habe ich keinen Zugriff auf MS SQL Server oder die Quelle. Sie müssen auch mehr Sachen machen, wenn Ihre Spalte einen Index darauf hat.)

Props zu Donnie für die Konvertierungssyntax.

[Bearbeiten]

Tom H. mit vorgeschlagen, die sp_rename gespeicherte Prozedur tempbar als bar (anstelle der Schritte 4-6) umzubenennen. Das ist eine MS SQL Server-spezifische Lösung, die für viele Umstände funktionieren kann. Die beschriebene Lösung funktioniert (mit Syntaxrevisionen) auf beliebigen SQL-Datenbank, unabhängig von der Version. In meinem Fall hatte ich es mit Primär- und Fremdschlüsseln zu tun, und nicht nur mit einem einzelnen Feld, also musste ich alle Operationen sorgfältig anordnen und über mehrere Versionen von MS SQL Server portierbar sein - wobei ich ausdrücklich zu meinen Gunsten arbeitete.

+1

Anstatt die Leiste zu löschen, neu hinzuzufügen und dann zu füllen, können Sie sie einfach ablegen und temporär umbenennen. –

+0

sp_rename funktioniert nicht in SQL CE. – Edgar

5

Nur Doppel-Cast es über einen Zwischen-Typ, was Sie wollen.

cast(cast(intField as varchar) as text)

+0

Ich werde diesen Versuch geben. Vielen Dank! Warum behandelt MS SQL das nicht selbst? – manu08

+1

'Text' ist speziell, Sie können nicht auf Gleichheit prüfen, müssen Volltextindizes verwenden, usw., so dass nur Felder, die dafür bekannt sind, Textdaten zu enthalten, in sie" umgewandelt "werden können. – Donnie

0

Hier ist eine kleine Beispielskript, das auf mögliche Methode zeigt:

create table test (id int) 

create table test_tmp (id ntext) 


insert into test 
values (1) 
insert into test 
values (2) 

insert into test_tmp 
select convert(ntext,cast(id as nvarchar)) from test 

drop table test 

exec sp_rename 'test_tmp','test' 

Grundsätzlich wir eine Kopie der Tabelle zu erstellen, füllen Sie es dann. Wir konvertieren zuerst das int in nvarchar, dann nehmen wir einen Textwert an. Schließlich löschen wir die alte Tabelle und benennen die temporäre Tabelle um.