Renomear a coluna SQL Server 2008

653

Estou usando o SQL Server 2008 e o Navicat. Eu preciso renomear uma coluna em uma tabela usando SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Esta declaração não funciona.

Serhio g. Lazin
fonte
5
Observe que essa não é uma duplicata da pergunta nº 174582, que é vinculada: esta é específica para o MS SQL, outra é independente do banco de dados.

Respostas:

1195

Usar sp_rename

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

Consulte: SQL SERVER - Como renomear um nome de coluna ou nome de tabela

Documentação: sp_rename (Transact-SQL)

Para o seu caso, seria:

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

Lembre-se de usar aspas simples para incluir seus valores.

Habib
fonte
24
Observe que você não deve colocar o NewColumnName entre colchetes, pois o SQL Server usará [[[NewColumnName]]]] como o nome da nova coluna. Além disso, sp_rename deve ser prefixado por EXEC ou EXECUTE.
Mark Freeman
29
Você tem permissão e é incentivado a colocar colchetes no primeiro parâmetro, identificando a coluna, mas não no segundo parâmetro. Assim:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch
2
Você deve observar na sua resposta que estes valores alças padrão de procedimento armazenado, nulos etc contraints ao fazer a mudança de nome, ao contrário de uma planície alter tableque falhará se existem tais restrições.
Tuncay Göncüoğlu
4
Observe que se você usar 'table_name.new_name', ele se tornará [schema]. [Table_name]. [Table_name.new_name] - portanto, não coloque esse nome de tabela no novo nome! (ele está correto nesta resposta, apenas adicionando uma nota para espreitadelas)
Mark Schultheiss
1
Se houver um esquema no banco de dados, você deverá colocar o nome do esquema antes do nome da tabela: EXEC sp_RENAME 'nome_do_ esquema \ nome da tabela.nome_da_tabela.old_name', 'novo_nome', 'COLUNA'
23/04/19
106

Como alternativa SQL, você pode fazer isso no Microsoft SQL Server Management Studio. Aqui estão algumas maneiras rápidas de usar a GUI:

Primeira Via

Lentamente, clique duas vezes na coluna. O nome da coluna se tornará uma caixa de texto editável.


Segunda Via

Clique com o botão direito do mouse na coluna e escolha Renomear no menu de contexto.

Por exemplo:

Para renomear o nome da coluna


Terceira Via

Dessa forma, é preferível quando você precisar renomear várias colunas de uma só vez.

  1. Clique com o botão direito do mouse na tabela que contém a coluna que precisa ser renomeada.
  2. Clique em Design .
  3. No painel de design da tabela, clique e edite a caixa de texto do nome da coluna que você deseja alterar.

Por exemplo: Exemplo de design da tabela MSSMS

NOTA: Eu sei que o OP pediu especificamente uma solução SQL, pensei que isso poderia ajudar outras pessoas :)

Carrie Kendall
fonte
1
Ou o usuário não tem os privilégios.
Carrie Kendall
6
Nunca faça isso. Você está copiando a tabela, largando a antiga e renomeando-a. NUNCA use a GUI NUNCA para alterar qualquer coisa sobre uma tabela.
HLGEM
6
@HLGEM essa é uma declaração bastante grande. De qualquer forma, você pode fornecer recursos para o que explicou? ou seja, deixar cair a mesa, etc. #
Carrie Kendall
2
@ CarrieKendall, escreva a alteração na GUI em vez de fazê-la e você verá. É por isso que é muito mais lento fazer uma alteração usando a GUI em uma tabela grande do que usando sp_rename ou alter table. Além disso, as alterações na estrutura do banco de dados são alterações de código e devem estar no controle de origem como outro código, portanto, devem estar em um script. Isso é especialmente importante se você não permitir que os direitos do banco de dados de produção dev alterem as tabelas, pois você precisará do script em qualquer caso. E você não deseja copiar, soltar e recriar tabelas com milhões de registros em prod.
HLGEM
18
Acabei de renomear uma tabela do SQL Server 2012 usando o Management Studio com o criador de perfil em execução e ele usou sp_rename. Não posso falar para versões anteriores.
21815 Steve Dowling
58

Tentar:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'
TechDo
fonte
27

Você também deve especificar o esquema da tabela ou poderá receber este erro:

Msg 15248, Nível 11, Estado 1, sp_rename do procedimento, Linha 238 O parâmetro @objname é ambíguo ou o @objtype reivindicado (COLUMN) está errado.

Se for um script de implantação, eu também recomendaria adicionar alguma segurança adicional a ele.

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
fonte
Eu gosto dessa abordagem segura, boa para escrever migrações que podem ou não ser executadas em ambientes diferentes.
Adil H. Raza #
como a verificação de existência, me faz sentir ok Reexecução como parte de um lote de outros scripts
unnknown
19

Seria uma boa sugestão usar uma função já incorporada, mas outra maneira de contornar é:

  1. Crie uma nova coluna com o mesmo tipo de dados e NEW NAME.
  2. Execute uma instrução UPDATE / INSERT para copiar todos os dados para uma nova coluna.
  3. Solte a coluna antiga.

O benefício por trás do uso do sp_renameé que ele cuida de todas as relações associadas a ele.

A partir da documentação :

sp_rename renomeia automaticamente o índice associado sempre que uma restrição PRIMARY KEY ou UNIQUE for renomeada. Se um índice renomeado estiver vinculado a uma restrição PRIMARY KEY, a restrição PRIMARY KEY também será renomeada automaticamente por sp_rename. sp_rename pode ser usado para renomear índices XML primários e secundários.

NeverHopeless
fonte
* No passo 1 NULL tem de ser permitido na nova coluna * adicionar Opcionalmente quarto passo de mudar nova coluna, que não permite valores nulos
BitLauncher
16

Você pode usar sp_renamepara renomear uma coluna.

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

O primeiro parâmetro é o objeto a ser modificado, o segundo parâmetro é o novo nome que será dado ao objeto, e o terceiro parâmetro COLUNA informa ao servidor que a renomeação é para o column, e também pode ser usado para mudar o nome tables, indexe alias data type.

Alexandre Neukirchen
fonte
2
Não entendo, por que você adiciona uma nova resposta mesmo acima de 4 em 5 menciona sp_rename ...?
Pawel Czapski
3
Em algum momento, alguém teria que explicar aqui o funcionamento do parâmetro, ninguém fez isso
Alexandre Neukirchen
1
Sim, na verdade você está certo, para mim é tão óbvio, mas para novos rapazes pode não ser.
Pawel Czapski
12

Como muitas vezes venho aqui e depois me pergunto como usar os colchetes, essa resposta pode ser útil para pessoas como eu.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • A OldColumnNamenão deve estar em []. Isso não vai funcionar.
  • Não coloque NewColumnNameem [], ele irá resultar em [[NewColumnName]].
HonzaB
fonte
3

O Sql Server management studio possui alguns procedimentos definidos pelo sistema (SP),
um dos quais é usado para renomear uma coluna. O SP é sp_rename

Sintaxe: sp_rename '[table_name] .old_column_name', 'new_column_name'
Para obter mais ajuda, consulte este artigo: sp_rename do Microsoft Docs

Nota: Na execução deste SP, o servidor sql fornecerá uma mensagem de aviso como ' Cuidado: alterar qualquer parte do nome de um objeto pode interromper scripts e procedimentos armazenados '. Isso é crítico apenas se você tiver escrito seu próprio sp, que envolve a coluna na tabela que você está prestes a mudar.

Tahir77667
fonte
2

Versão aprimorada do @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
fonte
0

Ou você pode clicar duas vezes lentamente na coluna no SQL Management Studio e renomeá-la através da interface do usuário ...

Dave Cole
fonte
-1

Executar consulta:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'
Purnima Bhatia
fonte
Por favor, não repita respostas antigas e existentes com muitos votos positivos.
TT.