Como renomear uma tabela no SQL Server?

370

A SQLconsulta que eu usei é:

ALTER TABLE oldtable RENAME TO newtable;

Mas, isso me dá um erro.

Servidor: mensagem 156, nível 15, estado 1, linha 1
Sintaxe incorreta perto da palavra-chave 'TO'.

Interruptor
fonte

Respostas:

683

Para renomear uma tabela no SQL Server, use o sp_renamecomando:

exec sp_rename 'schema.old_table_name', 'new_table_name'
Jeff Hornby
fonte
7
Mais uma coisa: se algum nome da tabela contiver um ., use []-o em torno do nome da tabela. (Eu sei, eu sei, mas os pontos podem acontecer ...) Por exemplo, sp_rename '[Stupid.name]', 'NewName'ou com esquemasp_rename '[dbo.Stupid.name]', 'NewName'
vacip
55
E, para adicionar, não coloque acidentalmente o esquema no 'NewName'campo, caso contrário, sua tabela pode acabar parecendo algo parecido dbo.dbo.NewName.
Michael Plautz
4
Lembre-se de que, ao renomear uma tabela, você certamente também deseja renomear quaisquer referências a essa tabela que possam existir em procedimentos armazenados, visualizações, funções etc. Um rápido google pode encontrar uma das muitas ferramentas que podem fazer isso por você. . Ou você pode usar um script que encontre uma determinada string em todos esses objetos e cole-os como instruções ALTER, faça uma busca e substituição e execute todos eles.
precisa saber é o seguinte
2
Você também pode criar um sinônimo nomeado após o antigo nome da tabela que aponta para a nova tabelaCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin
não coloque um novo nome entre colchetes! caso contrário, a tabela terá colchetes no nome. Então: 'new_table_name' - está correto, '[new_table_name]' - causará problemas
VeganHunter
143

Para renomear uma coluna:

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

Para renomear uma tabela:

sp_rename 'old_table_name','new_table_name';
Ravi Kumar
fonte
Não explica como lidar com esquemas diferentes do dbo padrão.
Sal
11
@ Sal Não menos do que qualquer outra resposta aqui? Você estava procurando como alterar o esquema de uma tabela ?
Bocados de bacon
14

Ao usar sp_rename, que funciona como nas respostas acima, verifique também quais objetos são afetados após renomear, que fazem referência a essa tabela, porque você também precisa alterá-los

Tomei um exemplo de código para dependências de tabela no blog de Pinal Dave aqui

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'

Portanto, todos esses objetos dependentes precisam ser atualizados também

Ou use algum suplemento, se puder, alguns deles possuem recursos para renomear objetos e todos dependem também de objetos ent


fonte
11

Se você tentar exec sp_rename receber um erro LockMatchID, poderá ser útil adicionar uma instrução use [database] primeiro:

eu tentei

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

O que eu tive que fazer para corrigi-lo foi reescrevê-lo para:

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

Nome da tabela

sp_rename 'db_name.old_table_name', 'new_table_name'

Coluna

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

Índice

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

também disponível para estática e tipos de dados

budamivardi
fonte
2
Para a coluna, falta uma vírgula entre o primeiro e o segundo parâmetros. Ele deve ser: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu
7

Isto é o que eu uso:

EXEC sp_rename 'MyTable', 'MyTableNewName';
Sylvain Rodrigue
fonte
0

Nada funcionou a partir da proposta aqui. Então, apenas coloquei os dados em uma nova tabela

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

talvez seja útil para alguém ..

No meu caso, ele não reconheceu o novo esquema e também o dbo era o proprietário.

ATUALIZAR

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

Trabalhou para mim. Encontrei a partir do script gerado automaticamente ao atualizar o PK para uma das tabelas. Dessa forma, também reconheceu o novo esquema.

Tzvi Gregory Kaidanov
fonte
0

Para alterar um nome de tabela com um esquema diferente:

Exemplo: Altere dbo.MyTable1 para wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
amor ao vivo
fonte