W SQL Server możesz użyć sp_rename
procedura składowana do zmiany nazwy obiektu, w tym kolumny.
Przykład
Oto przykład do zademonstrowania:
EXEC sp_rename 't1.c1', 'c11';
Zmienia to nazwę kolumny o nazwie c1
(w t1
table) do c11
.
W tym typ obiektu
Jako trzeci argument można również dołączyć typ obiektu. W takim przypadku możemy użyć COLUMN
:
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';
W tym nazwa schematu
Możesz również zakwalifikować pierwszą kolumnę nazwą schematu, w takim przypadku może to wyglądać mniej więcej tak:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';
W tym przykładzie dbo
to nazwa schematu, ale musisz użyć dowolnego schematu.
W tym nazwy parametrów
Podobnie jak w przypadku każdej procedury składowanej, można również dołączyć nazwy parametrów podczas wywoływania sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1.c1',
@newname = 'c11',
@objtype = 'COLUMN';
Sprawdź referencje
Gdy zmienisz nazwę kolumny w SQL Server, prawdopodobnie zobaczysz taki komunikat:
Caution: Changing any part of an object name could break scripts and stored procedures.
Dzieje się tak, ponieważ po zmianie nazwy kolumny SQL Server nie automatycznie zmień nazwy wszelkich odwołań do tej kolumny. Dotyczy to również zmiany nazwy tabeli.
Pomimo powyższego ostrzeżenia, nazwa kolumny i tak została zmieniona.
Jeśli spróbujemy wysłać zapytanie do widoku, który odwołuje się do kolumny o zmienionej nazwie, otrzymamy błąd.
SELECT * FROM vt1;
Wynik:
Msg 207, Level 16, State 1, Procedure vt1, Line 2 Invalid column name 'c1'. Msg 4413, Level 16, State 1, Line 1 Could not use view or function 'vt1' because of binding errors.
Ten widok próbuje odwołać się do c1
ale nazwa tej kolumny została zmieniona, dlatego w tabeli nie ma kolumn o tej nazwie.
Definicja tego widoku wygląda tak:
CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;
Musielibyśmy zaktualizować ten widok, aby odwoływał się do nowej nazwy kolumny. Więc możemy to zrobić:
ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;
Teraz zapytanie o widok zwróci prawidłowe dane.
Dlatego przed zmianą nazw kolumn należy zawsze sprawdzić skrypty i procedury składowane, które odwołują się do tej kolumny. Będziesz musiał zaktualizować takie skrypty i procedury, aby odwoływały się do nowej nazwy kolumny.
Możesz użyć sys.sql_expression_dependencies
widok katalogu systemowego, aby to sprawdzić.
Zmienianie nazw kolumn wyliczanych
SQL Server nie pozwala nam zmieniać nazw kolumn wyliczanych.
Jeśli spróbujesz zmienić nazwę kolumny wyliczanej, prawdopodobnie zobaczysz następujący komunikat o błędzie.
EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';
Wynik:
Caution: Changing any part of an object name could break scripts and stored procedures. Msg 4928, Level 16, State 1, Procedure sp_rename, Line 689 Cannot alter column 'c3' because it is 'COMPUTED'.
W tym przypadku c3
kolumna to kolumna obliczana, która wykonuje obliczenia na podstawie wartości w c2
kolumna.
Oto, co się dzieje, gdy próbujemy zmienić nazwę c2
kolumna.
EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';
Wynik:
Msg 15336, Level 16, State 1, Procedure sp_rename, Line 563 Object 'dbo.t1.c2' cannot be renamed because the object participates in enforced dependencies.
Dla tej kolumny otrzymujemy inny błąd. Ten błąd jest spowodowany tym, że obliczona kolumna zależy od tej kolumny.
Zasadniczo, aby zmienić nazwę kolumny wyliczanej, musielibyśmy ją usunąć i dodać ponownie.
Przykład:
ALTER TABLE t1
DROP COLUMN c3;
ALTER TABLE t1
ADD c13 AS c2 * 10;
Klucze obce
Zmiana nazwy kolumny klucza podstawowego nie powoduje uszkodzenia żadnych kluczy obcych, które odwołują się do tej kolumny.
Na przykład, zanim zmieniłem nazwę t1.c1
do t1.c11
, chociaż o tym nie wspomniałem, w rzeczywistości miałem inną tabelę i kolumnę (t2.c2
) odwołujące się do t1.c1
.
Po zmianie nazwy t1.c1
do t1.c11
, ograniczenie klucza obcego w t2.c2
nadal wymuszał zgodność nowych wstawek z kluczem obcym, mimo że nazwa kolumny klucza podstawowego w drugiej tabeli została zmieniona.