In SQL Server können Sie den sp_rename
verwenden gespeicherte Prozedur zum Umbenennen eines Objekts, einschließlich einer Spalte.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung:
EXEC sp_rename 't1.c1', 'c11';
Dadurch wird die Spalte mit dem Namen c1
umbenannt (im t1
Tabelle) zu c11
.
Einschließlich des Objekttyps
Sie können auch den Objekttyp als drittes Argument angeben. In diesem Fall können wir COLUMN
verwenden :
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';
Einschließlich des Schemanamens
Sie können die erste Spalte auch mit dem Schemanamen qualifizieren, in diesem Fall könnte sie etwa so aussehen:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';
In diesem Beispiel dbo
ist der Schemaname, aber Sie müssen das anwendbare Schema verwenden.
Einschließlich der Parameternamen
Wie bei jeder gespeicherten Prozedur können Sie auch die Parameternamen beim Aufruf von sp_rename
einschließen :
EXEC sp_rename
@objname = 'dbo.t1.c1',
@newname = 'c11',
@objtype = 'COLUMN';
Nach Referenzen suchen
Wenn Sie eine Spalte in SQL Server umbenennen, sehen Sie wahrscheinlich eine Meldung wie diese:
Achtung:Das Ändern eines beliebigen Teils eines Objektnamens könnte Skripte und gespeicherte Prozeduren beschädigen.
Dies liegt daran, dass SQL Server nicht eine Spalte umbenennt alle Verweise auf diese Spalte automatisch umbenennen. Dies gilt auch, wenn Sie eine Tabelle umbenennen.
Trotz obiger Warnmeldung wird die Spalte trotzdem umbenannt.
Wenn wir versuchen, eine Ansicht abzufragen, die auf die umbenannte Spalte verwiesen hat, erhalten wir eine Fehlermeldung.
SELECT * FROM vt1;
Ergebnis:
Meldung 207, Ebene 16, Status 1, Prozedur vt1, Zeile 2. Ungültiger Spaltenname „c1“.>Diese Ansicht versucht, auf
c1
zu verweisen aber diese Spalte wurde umbenannt, und daher gibt es keine Spalten mit diesem Namen in der Tabelle.Die Definition dieser Ansicht sieht folgendermaßen aus:
CREATE VIEW vt1 AS SELECT c1, c2 FROM dbo.t1;
Wir müssten diese Ansicht aktualisieren, um auf den neuen Spaltennamen zu verweisen. Wir könnten also Folgendes tun:
ALTER VIEW vt1 AS SELECT c11, c2 FROM dbo.t1;
Wenn Sie jetzt die Ansicht abfragen, werden die richtigen Daten zurückgegeben.
Bevor Sie Spalten umbenennen, sollten Sie daher immer nach Skripts und gespeicherten Prozeduren suchen, die auf diese Spalte verweisen. Sie müssen solche Skripte und Prozeduren aktualisieren, um auf den neuen Spaltennamen zu verweisen.
Sie können die
sys.sql_expression_dependencies
verwenden Systemkatalogansicht, um diese Prüfung durchzuführen.Berechnete Spalten umbenennen
SQL Server lässt uns berechnete Spalten nicht umbenennen.
Wenn Sie versuchen, eine berechnete Spalte umzubenennen, wird wahrscheinlich die folgende Fehlermeldung angezeigt.
EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';
Ergebnis:
Achtung:Das Ändern eines beliebigen Teils eines Objektnamens könnte Skripte und gespeicherte Prozeduren beschädigen. Msg 4928, Ebene 16, Status 1, Prozedur sp_rename, Zeile 689Kann Spalte 'c3' nicht ändern, weil sie 'COMPUTED' ist.In diesem Fall das
c3
Spalte ist eine berechnete Spalte, die eine Berechnung basierend auf einem Wert inc2
durchführt Spalte.Folgendes passiert, wenn wir versuchen,
c2
umzubenennen Spalte.EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';
Ergebnis:
Meldung 15336, Ebene 16, Zustand 1, Prozedur sp_rename, Zeile 563Objekt 'dbo.t1.c2' kann nicht umbenannt werden, da das Objekt an erzwungenen Abhängigkeiten beteiligt ist.Wir erhalten einen anderen Fehler für diese Spalte. Dieser Fehler tritt auf, weil die berechnete Spalte von dieser Spalte abhängt.
Um die berechnete Spalte umzubenennen, müssten wir sie grundsätzlich löschen und erneut hinzufügen.
Beispiel:
ALTER TABLE t1 DROP COLUMN c3; ALTER TABLE t1 ADD c13 AS c2 * 10;
Fremdschlüssel
Durch das Umbenennen einer Primärschlüsselspalte werden keine Fremdschlüssel beschädigt, die auf diese Spalte verweisen.
Zum Beispiel, bevor ich
t1.c1
umbenannt habe zut1.c11
, obwohl ich es nicht erwähnt habe, hatte ich tatsächlich eine andere Tabelle und Spalte (t2.c2
), die auft1.c1
verwiesen .Nach dem Umbenennen von
t1.c1
zut1.c11
, die Fremdschlüsseleinschränkung fürt2.c2
erzwang immer noch alle neuen Einfügungen, um dem Fremdschlüssel zu entsprechen, obwohl der Name der Primärschlüsselspalte in der anderen Tabelle geändert worden war.