Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Umbenennen einer Spalte in SQL Server (T-SQL)

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 in c2 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 zu t1.c11 , obwohl ich es nicht erwähnt habe, hatte ich tatsächlich eine andere Tabelle und Spalte (t2.c2 ), die auf t1.c1 verwiesen .

Nach dem Umbenennen von t1.c1 zu t1.c11 , die Fremdschlüsseleinschränkung für t2.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.