sql >> Database >  >> RDS >> Sqlserver

De naam van een kolom in SQL Server wijzigen (T-SQL)

In SQL Server kunt u de sp_rename . gebruiken opgeslagen procedure om een ​​object te hernoemen, inclusief een kolom.

Voorbeeld

Hier is een voorbeeld om te demonstreren:

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

Dit hernoemt de kolom genaamd c1 (in de t1 tabel) naar c11 .

Inclusief het objecttype

U kunt het objecttype ook als derde argument opnemen. In dit geval kunnen we COLUMN . gebruiken :

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

Inclusief de Schemanaam

U kunt de eerste kolom ook kwalificeren met de schemanaam, in welk geval deze er ongeveer zo uit kan zien:

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

In dit voorbeeld dbo is de schemanaam, maar je moet het schema gebruiken dat van toepassing is.

Inclusief de parameternamen

Zoals bij elke opgeslagen procedure, kunt u ook de parameternamen opnemen bij het aanroepen van sp_rename :

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

Controleer op referenties

Wanneer u de naam van een kolom in SQL Server wijzigt, ziet u waarschijnlijk een bericht als dit:

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

Dit komt omdat wanneer u de naam van een kolom wijzigt, SQL Server niet hernoem automatisch alle verwijzingen naar die kolom. Dit geldt ook als je een tabel hernoemt.

Ondanks de waarschuwing hierboven, wordt de kolom toch hernoemd.

Als we proberen een weergave op te vragen die verwijst naar de hernoemde kolom, krijgen we een foutmelding.

SELECT * FROM vt1;

Resultaat:

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

Deze weergave probeert te verwijzen naar c1 maar die kolom is hernoemd, en dus zijn er geen kolommen met die naam in de tabel.

De definitie van deze weergave ziet er als volgt uit:

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

We moeten deze weergave bijwerken om naar de nieuwe kolomnaam te verwijzen. Dus we zouden dit kunnen doen:

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

Als u nu de weergave opvraagt, worden de juiste gegevens geretourneerd.

Daarom moet u, voordat u de naam van kolommen wijzigt, altijd controleren op scripts en opgeslagen procedures die naar die kolom verwijzen. U moet dergelijke scripts en procedures bijwerken om naar de nieuwe kolomnaam te verwijzen.

U kunt de sys.sql_expression_dependencies . gebruiken systeemcatalogusweergave om deze controle uit te voeren.

De naam van berekende kolommen wijzigen

SQL Server laat ons de naam van berekende kolommen niet wijzigen.

Als u de naam van een berekende kolom probeert te wijzigen, ziet u waarschijnlijk de volgende foutmelding.

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

Resultaat:

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

In dit geval is de c3 kolom is een berekende kolom die een berekening uitvoert op basis van een waarde in de c2 kolom.

Dit gebeurt er als we proberen de c2 te hernoemen kolom.

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

Resultaat:

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.

We krijgen een andere fout voor deze kolom. Deze fout is omdat de berekende kolom afhankelijk is van deze kolom.

Kortom, om de berekende kolom te hernoemen, moeten we deze verwijderen en opnieuw toevoegen.

Voorbeeld:

ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Buitenlandse sleutels

Het hernoemen van een primaire sleutelkolom verbreekt geen externe sleutels die naar die kolom verwijzen.

Voordat ik bijvoorbeeld t1.c1 . hernoemde naar t1.c11 , hoewel ik het niet vermeldde, had ik eigenlijk een andere tabel en kolom (t2.c2 ) die verwijst naar t1.c1 .

Na het hernoemen van t1.c1 naar t1.c11 , de externe sleutelbeperking op t2.c2 dwong nog steeds nieuwe invoegingen af ​​om te voldoen aan de externe sleutel, hoewel de naam van de primaire sleutelkolom in de andere tabel was veranderd.


  1. MySQL Onjuiste datetime-waarde:'0000-00-00 00:00:00'

  2. Installeer Oracle Instant-client in Docker-container voor Python cx_Oracle

  3. Automatische gegevensverzameling:databasebestanden en logische schijven in MS SQL Server

  4. Het MySQL-rootgebruikerswachtwoord instellen op OS X