V SQL Server můžete použít sp_rename
uložená procedura k přejmenování objektu, včetně sloupce.
Příklad
Zde je příklad k demonstraci:
EXEC sp_rename 't1.c1', 'c11';
Tím se přejmenuje sloupec nazvaný c1
(v t1
tabulka) na c11
.
Včetně typu objektu
Jako třetí argument můžete také zahrnout typ objektu. V tomto případě můžeme použít COLUMN
:
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';
Včetně názvu schématu
První sloupec můžete také kvalifikovat názvem schématu, v takovém případě může vypadat nějak takto:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';
V tomto příkladu dbo
je název schématu, ale budete muset použít jakékoli použitelné schéma.
Včetně názvů parametrů
Stejně jako u jakékoli uložené procedury můžete také při volání sp_rename
zahrnout názvy parametrů :
EXEC sp_rename
@objname = 'dbo.t1.c1',
@newname = 'c11',
@objtype = 'COLUMN';
Kontrola referencí
Když přejmenujete sloupec na serveru SQL Server, pravděpodobně se vám zobrazí tato zpráva:
Caution: Changing any part of an object name could break scripts and stored procedures.
Je to proto, že když přejmenujete sloupec, SQL Server to nedělá automaticky přejmenovat všechny odkazy na tento sloupec. To platí také při přejmenování tabulky.
Navzdory výše uvedené varovné zprávě je sloupec stejně přejmenován.
Pokud se pokusíme dotazovat na pohled, který odkazoval na přejmenovaný sloupec, dostaneme chybu.
SELECT * FROM vt1;
Výsledek:
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.
Tento pohled se pokouší odkazovat na c1
ale tento sloupec byl přejmenován, takže v tabulce nejsou žádné sloupce s tímto názvem.
Definice tohoto pohledu vypadá takto:
CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;
Toto zobrazení bychom museli aktualizovat, aby odkazovalo na nový název sloupce. Takže bychom mohli udělat toto:
ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;
Nyní dotaz na zobrazení vrátí správná data.
Před přejmenováním sloupců byste proto měli vždy zkontrolovat skripty a uložené procedury, které na daný sloupec odkazují. Budete muset aktualizovat takové skripty a procedury, aby odkazovaly na nový název sloupce.
Můžete použít sys.sql_expression_dependencies
k provedení této kontroly.
Přejmenování vypočítaných sloupců
SQL Server nám neumožňuje přejmenovat vypočítané sloupce.
Pokud se pokusíte přejmenovat vypočítaný sloupec, pravděpodobně se vám zobrazí následující chybová zpráva.
EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';
Výsledek:
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'.
V tomto případě c3
sloupec je vypočítaný sloupec, který provádí výpočet na základě hodnoty v c2
sloupec.
Zde je to, co se stane, když se pokusíme přejmenovat c2
sloupec.
EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';
Výsledek:
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.
Pro tento sloupec dostáváme jinou chybu. Tato chyba je způsobena tím, že vypočítaný sloupec závisí na tomto sloupci.
V podstatě, abychom přejmenovali vypočítaný sloupec, museli bychom jej vypustit a znovu přidat.
Příklad:
ALTER TABLE t1
DROP COLUMN c3;
ALTER TABLE t1
ADD c13 AS c2 * 10;
Zahraniční klíče
Přejmenování sloupce primárního klíče nezruší žádné cizí klíče, které na tento sloupec odkazují.
Například předtím, než jsem přejmenoval t1.c1
na t1.c11
, ačkoli jsem to nezmínil, ve skutečnosti jsem měl jinou tabulku a sloupec (t2.c2
), který odkazoval na t1.c1
.
Po přejmenování t1.c1
na t1.c11
, omezení cizího klíče na t2.c2
stále vynucoval jakékoli nové vložení, aby vyhovoval cizímu klíči, i když se název sloupce primárního klíče v druhé tabulce změnil.