Comment renommer une table dans SQL Server?


370

La SQLrequête que j'ai utilisée est:

ALTER TABLE oldtable RENAME TO newtable;

Mais cela me donne une erreur.

Serveur: Msg 156, niveau 15, état 1, ligne 1
Syntaxe incorrecte près du mot clé "TO".

Réponses:


683

Pour renommer une table dans SQL Server, utilisez la sp_renamecommande:

exec sp_rename 'schema.old_table_name', 'new_table_name'

7
Une dernière chose: si l'un des noms de table contient un ., utilisez-le []autour du nom de la table. (Je sais, je sais, mais des points peuvent arriver ...) Par exemple sp_rename '[Stupid.name]', 'NewName'ou avec un schémasp_rename '[dbo.Stupid.name]', 'NewName'
vacip

55
Et pour ajouter, ne mettez pas accidentellement le schéma dans le 'NewName'champ, sinon votre table pourrait finir par ressembler à quelque chose dbo.dbo.NewName.
Michael Plautz

4
Gardez à l'esprit que lorsque vous renommez une table, vous voulez presque certainement renommer également toutes les références à cette table qui peuvent exister dans les procédures stockées, les vues, les fonctions, etc. Un rapide google peut trouver l'un des nombreux outils qui peuvent le faire pour vous. . Ou vous pouvez utiliser un script qui trouve une chaîne donnée dans tous ces objets, les coller en tant qu'instructions ALTER, effectuer une recherche et un remplacement, puis les exécuter tous.
MGOwen

2
Vous pouvez également créer un synonyme nommé d'après l'ancien nom de la table pointant vers la nouvelle tableCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin

ne placez pas de nouveau nom entre crochets! sinon le tableau aura des crochets DANS le nom. Donc: 'nouveau_nom_table' - est correct, '[nouveau_nom_table]' - vous
causera des

143

Pour renommer une colonne:

sp_rename 'table_name.old_column_name', 'new_column_name' , 'COLUMN';

Pour renommer une table:

sp_rename 'old_table_name','new_table_name';

N'explique pas comment gérer les schémas autres que le dbo par défaut.
Sal

1
@Sal Pas moins que toute autre réponse ici? Cherchiez-vous comment modifier le schéma d'une table ?
Bacon Bits

14

Lorsque vous utilisez sp_rename qui fonctionne comme dans les réponses ci-dessus, vérifiez également quels objets sont affectés après le changement de nom, qui font référence à cette table, car vous devez également les modifier

J'ai pris un exemple de code pour les dépendances de table sur le blog de Pinal Dave ici

USE AdventureWorks
GO
SELECT
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
referencing_object_name = o.name,
referencing_object_type_desc = o.type_desc,
referenced_schema_name,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc,
referenced_server_name, referenced_database_name
--,sed.* -- Uncomment for all the columns
FROM
sys.sql_expression_dependencies sed
INNER JOIN
sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
sys.objects o1 ON sed.referenced_id = o1.[object_id]
WHERE
referenced_entity_name = 'Customer'

Donc, tous ces objets dépendants doivent également être mis à jour

Ou utilisez un complément si vous le pouvez, certains d'entre eux ont la fonction de renommer l'objet, et tous dépendent également des objets


11

Si vous essayez de exec sp_renamerecevoir une erreur LockMatchID, il peut être utile d'ajouter d'abord une instruction use [database]:

j'ai essayé

 exec sp_rename '[database_name].[dbo].[table_name]', 'new_table_name';
 -- Invalid EXECUTE statement using object "Object", method "LockMatchID".

Ce que je devais faire pour le réparer, c'était de le réécrire:

use database_name
exec sp_rename '[dbo].[table_name]', 'new_table_name';

10

Nom de la table

sp_rename 'db_name.old_table_name', 'new_table_name'

Colonne

sp_rename 'db_name.old_table_name.name' 'userName', 'COLUMN'

Indice

sp_rename 'db_name.old_table_name.id', 'product_ID', 'INDEX'

également disponible pour la statique et les types de données


2
Pour la colonne, vous manquez une virgule entre les premier et deuxième paramètres. Il doit être: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu


0

Rien n'a fonctionné de ce qui est proposé ici .. Donc, juste pore les données dans un nouveau tableau

SELECT * 
INTO [acecodetable].['PSCLineReason']
FROM [acecodetable].['15_PSCLineReason'];

peut être utile à quelqu'un ..

Dans mon cas, il n'a pas reconnu le nouveau schéma et le dbo en était le propriétaire.

MISE À JOUR

EXECUTE sp_rename N'[acecodetable].[''TradeAgreementClaim'']', N'TradeAgreementClaim';

A travaillé pour moi. Je l'ai trouvé à partir du script généré automatiquement lors de la mise à jour du PK pour l'une des tables. De cette façon, il a également reconnu le nouveau schéma.


0

Pour modifier un nom de table avec un schéma différent:

Exemple: remplacez dbo.MyTable1 par wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.