sql >> Database teknologi >  >> RDS >> Sqlserver

Omdøb en kolonne i SQL Server (T-SQL)

I SQL Server kan du bruge sp_rename gemt procedure til at omdøbe et objekt, inklusive en kolonne.

Eksempel

Her er et eksempel til demonstration:

EXEC sp_rename 't1.c1', 'c11';

Dette omdøber kolonnen kaldet c1 (i t1 tabel) til c11 .

Inklusive objekttypen

Du kan også inkludere objekttypen som et tredje argument. I dette tilfælde kan vi bruge COLUMN :

EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';

Inklusive skemanavnet

Du kan også kvalificere den første kolonne med skemanavnet, i hvilket tilfælde det kan se sådan ud:

EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';

I dette eksempel, dbo er skemanavnet, men du bliver nødt til at bruge det skema, der er relevant.

Inklusive parameternavnene

Som med enhver lagret procedure kan du også inkludere parameternavnene, når du kalder sp_rename :

EXEC sp_rename 
    @objname = 'dbo.t1.c1',
    @newname = 'c11',
    @objtype = 'COLUMN';

Søg efter referencer

Når du omdøber en kolonne i SQL Server, vil du sandsynligvis se en meddelelse som denne:

Caution: Changing any part of an object name could break scripts and stored procedures.

Dette skyldes, at SQL Server ikke gør det, når du omdøber en kolonne automatisk omdøbe eventuelle referencer til den kolonne. Dette gælder også, når du omdøber en tabel.

På trods af ovenstående advarselsmeddelelse omdøbes kolonnen alligevel.

Hvis vi forsøger at forespørge på en visning, der refererede til den omdøbte kolonne, får vi en fejl.

SELECT * FROM vt1;

Resultat:

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.
>

Denne visning forsøger at henvise til c1 men den kolonne er blevet omdøbt, så der er ingen kolonner med det navn i tabellen.

Denne visnings definition ser sådan ud:

CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;

Vi bliver nødt til at opdatere denne visning for at referere til det nye kolonnenavn. Så vi kunne gøre dette:

ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;

Når du nu forespørger i visningen, returneres de korrekte data.

Før du omdøber nogen kolonner, bør du derfor altid tjekke for scripts og lagrede procedurer, der refererer til den kolonne. Du bliver nødt til at opdatere sådanne scripts og procedurer for at referere til det nye kolonnenavn.

Du kan bruge sys.sql_expression_dependencies systemkatalogvisning for at udføre denne kontrol.

Omdøbning af beregnede kolonner

SQL Server lader os ikke omdøbe beregnede kolonner.

Hvis du prøver at omdøbe en beregnet kolonne, vil du sandsynligvis se følgende fejlmeddelelse.

EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';

Resultat:

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'.

I dette tilfælde er c3 kolonne er en beregnet kolonne, der udfører en beregning baseret på en værdi i c2 kolonne.

Her er, hvad der sker, når vi forsøger at omdøbe c2 kolonne.

EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';

Resultat:

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.

Vi får en anden fejl for denne kolonne. Denne fejl skyldes, at den beregnede kolonne afhænger af denne kolonne.

Grundlæggende, for at omdøbe den beregnede kolonne, ville vi være nødt til at droppe den og tilføje den igen.

Eksempel:

ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Udenlandske nøgler

Omdøbning af en primær nøglekolonne bryder ikke nogen fremmednøgler, der refererer til den kolonne.

For eksempel før jeg omdøbte t1.c1 til t1.c11 , selvom jeg ikke nævnte det, havde jeg faktisk en anden tabel og kolonne (t2.c2 ), der refererede til t1.c1 .

Efter at have omdøbt t1.c1 til t1.c11 , den fremmede nøgle-begrænsning på t2.c2 håndhævede stadig nye indsættelser for at overholde den fremmede nøgle, selvom den primære nøglekolonne i den anden tabel havde fået sit navn ændret.


  1. Hvordan kalder jeg en Oracle-lagret procedure fra et Excel VBA-script?

  2. Django:Bordet findes ikke

  3. Træk timer fra nu()-funktionen

  4. Hvordan kan jeg få en liste over elementnavne fra en XML-værdi i SQL Server