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

Rinominare una colonna in SQL Server (T-SQL)

In SQL Server puoi usare sp_rename stored procedure per rinominare un oggetto, inclusa una colonna.

Esempio

Ecco un esempio da dimostrare:

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

Questo rinomina la colonna chiamata c1 (nel t1 tabella) in c11 .

Incluso il tipo di oggetto

Puoi anche includere il tipo di oggetto come terzo argomento. In questo caso, possiamo utilizzare COLUMN :

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

Incluso il nome dello schema

Puoi anche qualificare la prima colonna con il nome dello schema, nel qual caso potrebbe assomigliare a questo:

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

In questo esempio, dbo è il nome dello schema, ma dovrai utilizzare qualsiasi schema applicabile.

Compresi i nomi dei parametri

Come con qualsiasi procedura memorizzata, puoi anche includere i nomi dei parametri quando chiami sp_rename :

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

Controlla i riferimenti

Quando rinomini una colonna in SQL Server, probabilmente vedrai un messaggio come questo:

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

Questo perché quando si rinomina una colonna, SQL Server non rinominare automaticamente tutti i riferimenti a quella colonna. Questo vale anche quando rinomini una tabella.

Nonostante il messaggio di avvertimento sopra, la colonna viene comunque rinominata.

Se proviamo a interrogare una vista che fa riferimento alla colonna rinominata, viene visualizzato un errore.

SELECT * FROM vt1;

Risultato:

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.

Questa vista sta cercando di fare riferimento a c1 ma quella colonna è stata rinominata, quindi non ci sono colonne con quel nome nella tabella.

La definizione di questa vista è simile alla seguente:

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

Avremmo bisogno di aggiornare questa vista per fare riferimento al nuovo nome di colonna. Quindi potremmo farlo:

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

Ora interrogando la vista verranno restituiti i dati corretti.

Pertanto, prima di rinominare qualsiasi colonna, è necessario verificare sempre la presenza di script e stored procedure che fanno riferimento a tale colonna. Sarà necessario aggiornare tali script e procedure per fare riferimento al nuovo nome di colonna.

Puoi usare sys.sql_expression_dependencies vista del catalogo di sistema per eseguire questo controllo.

Rinominare le colonne calcolate

SQL Server non ci consente di rinominare le colonne calcolate.

Se provi a rinominare una colonna calcolata, probabilmente vedrai il seguente messaggio di errore.

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

Risultato:

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 questo caso, il c3 column è una colonna calcolata che esegue un calcolo in base a un valore in c2 colonna.

Ecco cosa succede quando proviamo a rinominare il c2 colonna.

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

Risultato:

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.

Otteniamo un errore diverso per questa colonna. Questo errore è dovuto al fatto che la colonna calcolata dipende da questa colonna.

Fondamentalmente, per rinominare la colonna calcolata, dovremmo rilasciarla e aggiungerla di nuovo.

Esempio:

ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Chiavi estere

La ridenominazione di una colonna di chiave primaria non interrompe le chiavi esterne che fanno riferimento a quella colonna.

Ad esempio, prima di rinominare t1.c1 a t1.c11 , anche se non l'ho menzionato, in realtà avevo un'altra tabella e colonna (t2.c2 ) che faceva riferimento a t1.c1 .

Dopo aver rinominato t1.c1 a t1.c11 , il vincolo di chiave esterna su t2.c2 stava ancora applicando eventuali nuovi inserimenti per conformarsi alla chiave esterna, anche se il nome della colonna della chiave primaria nell'altra tabella era stato cambiato.