Renommer la colonne SQL Server 2008

653

J'utilise SQL Server 2008 et Navicat. J'ai besoin de renommer une colonne d'une table en utilisant SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Cette déclaration ne fonctionne pas.

Serhio g. Lazin
la source
5
Notez que ce n'est pas tout à fait un double de la question # 174582 qui est liée par swetha: celle-ci est spécifique à MS SQL, celle-ci est indépendante de la base de données.

Réponses:

1195

Utilisation sp_rename

EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'

Voir: SQL SERVER - Comment renommer un nom de colonne ou un nom de table

Documentation: sp_rename (Transact-SQL)

Pour votre cas ce serait:

EXEC sp_RENAME 'table_name.old_name', 'new_name', 'COLUMN'

N'oubliez pas d'utiliser des guillemets simples pour entourer vos valeurs.

Habib
la source
24
Notez que vous ne devez pas mettre le NewColumnName entre crochets, car SQL Server utilisera alors [[[NewColumnName]]] comme nom de la nouvelle colonne. En outre, sp_rename doit être préfixé par EXEC ou EXECUTE.
Mark Freeman
29
Vous êtes autorisé et encouragé à mettre des crochets dans le premier paramètre, identifiant la colonne, mais pas dans le second paramètre. Comme ça:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch
2
Vous devez noter dans votre réponse que cette procédure stockée gère les valeurs par défaut, les contraintes nulles, etc. lors du changement de nom, par opposition à un simple alter tablequi ÉCHOUERA si de telles contraintes existent.
Tuncay Göncüoğlu
4
Notez que si vous utilisez 'table_name.new_name' alors il devient [schéma]. [Table_name]. [Table_name.new_name] - alors ne mettez pas ce nom de table dans le nouveau nom! (c'est correct dans cette réponse, juste en ajoutant une note pour les voyants)
Mark Schultheiss
1
S'il y a un schéma dans la base de données que vous devez mettre le nom du schéma avant le nom de la table: EXEC sp_rename « schema_name.table_name.old_name », « nouveau_nom », « colonne »
amin
106

Vous SQLpouvez également le faire dans Microsoft SQL Server Management Studio. Voici quelques façons rapides d'utiliser l'interface graphique:

Première voie

Double-cliquez lentement sur la colonne. Le nom de la colonne deviendra une zone de texte modifiable.


Deuxième voie

Faites un clic droit sur la colonne et choisissez Renommer dans le menu contextuel.

Par exemple:

Pour renommer le nom de la colonne


Troisième voie

Cette méthode est préférable lorsque vous devez renommer plusieurs colonnes en une seule fois.

  1. Cliquez avec le bouton droit sur le tableau qui contient la colonne qui doit être renommée.
  2. Cliquez sur Conception .
  3. Dans le panneau de conception de tableau, cliquez sur et modifiez la zone de texte du nom de colonne que vous souhaitez modifier.

Par exemple: Exemple de conception de table MSSMS

REMARQUE: je sais que OP a spécifiquement demandé une solution SQL, pensant que cela pourrait aider les autres :)

Carrie Kendall
la source
1
Ou l'utilisateur n'a pas les privilèges.
Carrie Kendall du
6
Ne fais jamais ça. Vous copiez la table, puis supprimez l'ancienne et la renommez. N'utilisez JAMAIS l'interface graphique pour modifier quoi que ce soit sur une table.
HLGEM
6
@HLGEM, c'est une déclaration assez large. Dans tous les cas, pouvez-vous fournir des ressources pour ce que vous avez expliqué? c.-à-d. laisser tomber la table, etc.
Carrie Kendall
2
@CarrieKendall, écrivez le changement de l'interface graphique au lieu de le faire et vous verrez. C'est pourquoi il est beaucoup plus lent d'apporter une modification à l'aide de l'interface graphique à une grande table que d'utiliser sp_rename ou alter table. En outre, les modifications apportées à la structure de la base de données sont des modifications de code et doivent être dans le contrôle de code source comme tout autre code, elles doivent donc être dans un script. Ceci est particulièrement important si vous ne permettez pas aux droits de la base de données de production de dev de changer les tables car vous aurez besoin du script dans tous les cas. Et vous ne voulez pas copier, supprimer et recréer des tables avec des millions d'enregistrements sur prod.
HLGEM du
18
Je viens de renommer une table SQL Server 2012 à l'aide de Management Studio avec le profileur en cours d'exécution et il a utilisé sp_rename. Je ne peux pas parler des versions antérieures.
Steve Dowling
58

Essayer:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'
TechDo
la source
27

Vous devez également spécifier le schéma de la table ou vous pourriez obtenir cette erreur:

Msg 15248, niveau 11, état 1, procédure sp_rename, ligne 238 Le paramètre @objname est ambigu ou le @objtype (COLUMN) revendiqué est incorrect.

S'il s'agit d'un script de déploiement, je recommanderais également d'y ajouter une sécurité supplémentaire.

IF EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'OldColumnName' AND
            object_name(object_id) = 'TableName'
    ) AND
    NOT EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'NewColumnName' AND
            object_name(object_id) = 'TableName'
    )
    EXEC sp_RENAME 'SchemaName.TableName.OldColumnName', 'NewColumnName', 'COLUMN';
Taher
la source
J'aime cette approche sûre, idéale pour écrire des migrations qui peuvent / peuvent ne pas s'exécuter sur différents environnements.
Adil H.Raza
comme la vérification de l'existence, me fait me sentir bien de relancer dans le cadre d'un lot d'autres scripts
inconnu
19

Ce serait une bonne suggestion d'utiliser une fonction déjà intégrée, mais une autre solution consiste à:

  1. Créez une nouvelle colonne avec le même type de données et NOUVEAU NOM.
  2. Exécutez une instruction UPDATE / INSERT pour copier toutes les données dans une nouvelle colonne.
  3. Déposez l'ancienne colonne.

L'avantage derrière l'utilisation du sp_renameest qu'il prend en charge toutes les relations qui lui sont associées.

De la documentation :

sp_rename renomme automatiquement l'index associé chaque fois qu'une contrainte PRIMARY KEY ou UNIQUE est renommée. Si un index renommé est lié à une contrainte PRIMARY KEY, la contrainte PRIMARY KEY est également renommée automatiquement par sp_rename. sp_rename peut être utilisé pour renommer des index XML primaires et secondaires.

NeverHopeless
la source
* À l'étape 1, NULL doit être autorisé dans la nouvelle colonne * Ajoutez éventuellement la 4ème étape pour modifier la nouvelle colonne, afin qu'elle n'autorise pas les valeurs NULL
BitLauncher
16

Vous pouvez utiliser sp_renamepour renommer une colonne.

USE YourDatabase;  
GO  
EXEC sp_rename 'TableName.OldColumnName', 'NewColumnName', 'COLUMN';  
GO  

Le premier paramètre est l'objet à modifier, le deuxième paramètre est le nouveau nom qui sera donné à l'objet et le troisième paramètre COLUMN informe le serveur que le changement de nom est pour le column, et peut également être utilisé pour renommer tables, indexet alias data type.

Alexandre Neukirchen
la source
2
Je ne comprends pas, pourquoi vous ajoutez une nouvelle réponse, même au-dessus de 4 sur 5, mentionnez sp_rename ...?
Pawel Czapski
3
À un moment donné, quelqu'un devrait expliquer ici le fonctionnement du paramètre, personne ne l'a fait
Alexandre Neukirchen
1
Oui, en fait, vous avez raison, pour moi, c'est tellement évident, mais pour les nouveaux gars, ça ne l'est peut-être pas.
Pawel Czapski
12

Comme je viens souvent ici et que je me demande ensuite comment utiliser les crochets, cette réponse pourrait être utile pour ceux comme moi.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • Le OldColumnNamene doit pas être dedans []. Ça ne marchera pas.
  • Ne pas mettre NewColumnNameen [], il en résultera en [[NewColumnName]].
HonzaB
la source
3

Sql Server Management Studio possède des procédures stockées (SP) définies par le système,
dont l'une est utilisée pour renommer une colonne. Le SP est sp_rename

Syntaxe: sp_rename '[nom_table] .old_column_name', 'new_column_name'
Pour plus d'informations, reportez-vous à cet article: sp_rename de Microsoft Docs

Remarque: lors de l' exécution de ce SP, le serveur SQL vous enverra un message d'avertissement comme `` Attention: la modification d'une partie du nom d'un objet peut casser les scripts et les procédures stockées '' .Ceci n'est critique que si vous avez écrit votre propre sp qui implique la colonne dans le tableau que vous êtes sur le point de changer.

Tahir77667
la source
2

Version améliorée de @Taher

DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @OldColumnName AS VARCHAR(128)
DECLARE @NewColumnName AS VARCHAR(128)
DECLARE @ParamValue AS VARCHAR(1000)

SET @SchemaName = 'dbo'
SET @TableName = 'tableName'
SET @OldColumnName = 'OldColumnName'
SET @NewColumnName = 'NewColumnName'
SET @ParamValue = @SchemaName + '.' + @TableName + '.' + @OldColumnName

IF EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @OldColumnName AND OBJECT_NAME(object_id) = @TableName
)
AND NOT EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @NewColumnName AND OBJECT_NAME(object_id) = @TableName
)
BEGIN
    EXEC sp_rename @ParamValue, @NewColumnName, 'COLUMN';
END
Rikin Patel
la source
0

Ou vous pouvez simplement cliquer deux fois lentement sur la colonne dans SQL Management Studio et la renommer via l'interface utilisateur ...

Dave Cole
la source
-1

Exécuter la requête:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'
Purnima Bhatia
la source
Veuillez ne pas répéter les réponses anciennes et existantes avec de nombreux votes positifs.
TT.