I SQL Server kan du använda sp_rename
lagrad procedur för att byta namn på ett objekt, inklusive en kolumn.
Exempel
Här är ett exempel att visa:
EXEC sp_rename 't1.c1', 'c11';
Detta byter namn på kolumnen som heter c1
(i t1
tabell) till c11
.
Inklusive objekttypen
Du kan också inkludera objekttypen som ett tredje argument. I det här fallet kan vi använda COLUMN
:
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';
Inklusive schemanamnet
Du kan också kvalificera den första kolumnen med schemanamnet, i vilket fall kan det se ut ungefär så här:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';
I det här exemplet, dbo
är schemanamnet, men du måste använda vilket schema som är tillämpligt.
Inklusive parameternamnen
Som med alla lagrade förfaranden kan du även inkludera parameternamnen när du anropar sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1.c1',
@newname = 'c11',
@objtype = 'COLUMN';
Sök efter referenser
När du byter namn på en kolumn i SQL Server kommer du förmodligen att se ett meddelande så här:
Caution: Changing any part of an object name could break scripts and stored procedures.
Detta beror på att SQL Server inte gör det när du byter namn på en kolumn byter automatiskt namn på alla referenser till den kolumnen. Detta gäller även när du byter namn på en tabell.
Trots ovanstående varningsmeddelande har kolumnen ändå bytt namn.
Om vi försöker fråga en vy som refererar till den omdöpta kolumnen får vi ett felmeddelande.
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.>
Den här vyn försöker referera till c1
men den kolumnen har bytt namn, så det finns inga kolumner med det namnet i tabellen.
Denna vys definition ser ut så här:
CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;
Vi skulle behöva uppdatera den här vyn för att referera till det nya kolumnnamnet. Så vi kunde göra detta:
ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;
Om du nu frågar i vyn returneras korrekt data.
Innan du byter namn på några kolumner bör du därför alltid leta efter skript och lagrade procedurer som refererar till den kolumnen. Du måste uppdatera sådana skript och procedurer för att referera till det nya kolumnnamnet.
Du kan använda sys.sql_expression_dependencies
systemkatalogvy för att göra denna kontroll.
Byta namn på beräknade kolumner
SQL Server låter oss inte byta namn på beräknade kolumner.
Om du försöker byta namn på en beräknad kolumn kommer du förmodligen att se följande felmeddelande.
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 det här fallet, c3
kolumn är en beräknad kolumn som gör en beräkning baserat på ett värde i c2
kolumn.
Här är vad som händer när vi försöker byta namn på c2
kolumn.
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 ett annat fel för den här kolumnen. Det här felet beror på att den beräknade kolumnen beror på den här kolumnen.
I grund och botten, för att byta namn på den beräknade kolumnen, skulle vi behöva släppa den och lägga till den igen.
Exempel:
ALTER TABLE t1
DROP COLUMN c3;
ALTER TABLE t1
ADD c13 AS c2 * 10;
Främmande nycklar
Att byta namn på en primärnyckelkolumn bryter inte några främmande nycklar som refererar till den kolumnen.
Till exempel innan jag döpte om t1.c1
till t1.c11
, även om jag inte nämnde det, hade jag faktiskt en annan tabell och kolumn (t2.c2
) som refererade till t1.c1
.
Efter att ha bytt namn på t1.c1
till t1.c11
, den främmande nyckelbegränsningen på t2.c2
framtvingade fortfarande alla nya infogningar för att följa den främmande nyckeln, även om den primära nyckelkolumnen i den andra tabellen hade fått sitt namn ändrat.