sql >> Databáze >  >> RDS >> Sqlserver

Přejmenování sloupce v SQL Server (T-SQL)

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.


  1. Jak zjistím, které tabulky odkazují na danou tabulku v Oracle SQL Developer?

  2. Sledování vysoké dostupnosti pro PostgreSQL pomocí Heartbeat

  3. PgBouncer 1.7 – „Barvy se po vzkříšení mění“

  4. Získejte krátký název měsíce v PostgreSQL