Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Renommer une colonne dans SQL Server (T-SQL)

Dans SQL Server, vous pouvez utiliser le sp_rename procédure stockée pour renommer un objet, y compris une colonne.

Exemple

Voici un exemple pour illustrer :

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

Cela renomme la colonne appelée c1 (dans le t1 tableau) à c11 .

Inclure le type d'objet

Vous pouvez également inclure le type d'objet comme troisième argument. Dans ce cas, nous pouvons utiliser COLUMN :

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

Inclure le nom du schéma

Vous pouvez également qualifier la première colonne avec le nom du schéma, auquel cas, cela pourrait ressembler à ceci :

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

Dans cet exemple, dbo est le nom du schéma, mais vous devrez utiliser le schéma applicable.

Inclure les noms des paramètres

Comme pour toute procédure stockée, vous pouvez également inclure les noms des paramètres lors de l'appel de sp_rename :

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

Vérifier les références

Lorsque vous renommez une colonne dans SQL Server, vous verrez probablement un message comme celui-ci :

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

En effet, lorsque vous renommez une colonne, SQL Server ne le fait pas renommer automatiquement toutes les références à cette colonne. Cela est également vrai lorsque vous renommez une table.

Malgré le message d'avertissement ci-dessus, la colonne est quand même renommée.

Si nous essayons d'interroger une vue qui fait référence à la colonne renommée, nous obtenons une erreur.

SELECT * FROM vt1;

Résultat :

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.

Cette vue essaie de référencer c1 mais cette colonne a été renommée et il n'y a donc aucune colonne portant ce nom dans la table.

La définition de cette vue ressemble à ceci :

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

Nous aurions besoin de mettre à jour cette vue pour référencer le nouveau nom de colonne. Nous pourrions donc faire ceci :

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

Maintenant, interroger la vue renverra les données correctes.

Par conséquent, avant de renommer des colonnes, vous devez toujours vérifier les scripts et les procédures stockées qui font référence à cette colonne. Vous devrez mettre à jour ces scripts et procédures pour référencer le nouveau nom de colonne.

Vous pouvez utiliser le sys.sql_expression_dependencies vue du catalogue système pour effectuer cette vérification.

Renommer les colonnes calculées

SQL Server ne nous permet pas de renommer les colonnes calculées.

Si vous essayez de renommer une colonne calculée, vous verrez probablement le message d'erreur suivant.

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

Résultat :

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

Dans ce cas, le c3 colonne est une colonne calculée qui effectue un calcul basé sur une valeur dans le c2 colonne.

Voici ce qui se passe lorsque nous essayons de renommer le c2 colonne.

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

Résultat :

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.

Nous obtenons une erreur différente pour cette colonne. Cette erreur est due au fait que la colonne calculée dépend de cette colonne.

Fondamentalement, pour renommer la colonne calculée, nous aurions besoin de la supprimer et de l'ajouter à nouveau.

Exemple :

ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Clés étrangères

Renommer une colonne de clé primaire ne casse aucune clé étrangère faisant référence à cette colonne.

Par exemple, avant de renommer t1.c1 à t1.c11 , même si je ne l'ai pas mentionné, j'avais en fait une autre table et colonne (t2.c2 ) qui fait référence à t1.c1 .

Après avoir renommé t1.c1 à t1.c11 , la contrainte de clé étrangère sur t2.c2 appliquait toujours toutes les nouvelles insertions pour se conformer à la clé étrangère, même si la colonne de clé primaire de l'autre table avait changé de nom.