Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Renomear uma coluna no SQL Server (T-SQL)


No SQL Server, você pode usar o sp_rename procedimento armazenado para renomear um objeto, incluindo uma coluna.

Exemplo


Segue um exemplo para demonstrar:
EXEC sp_rename 't1.c1', 'c11';

Isso renomeia a coluna chamada c1 (no t1 tabela) para c11 .

Incluindo o tipo de objeto


Você também pode incluir o tipo de objeto como um terceiro argumento. Neste caso, podemos usar COLUMN :
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';

Incluindo o nome do esquema


Você também pode qualificar a primeira coluna com o nome do esquema, nesse caso, pode ser algo assim:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';

Neste exemplo, dbo é o nome do esquema, mas você precisará usar qualquer esquema aplicável.

Incluindo os nomes dos parâmetros


Como em qualquer procedimento armazenado, você também pode incluir os nomes dos parâmetros ao chamar sp_rename :
EXEC sp_rename 
    @objname = 'dbo.t1.c1',
    @newname = 'c11',
    @objtype = 'COLUMN';

Verificar referências


Ao renomear uma coluna no SQL Server, você provavelmente verá uma mensagem como esta:
Caution: Changing any part of an object name could break scripts and stored procedures.

Isso ocorre porque quando você renomeia uma coluna, o SQL Server não renomear automaticamente quaisquer referências a essa coluna. Isso também é verdade quando você renomeia uma tabela.

Apesar da mensagem de advertência acima, a coluna é renomeada de qualquer maneira.

Se tentarmos consultar uma exibição que fez referência à coluna renomeada, obteremos um erro.
SELECT * FROM vt1;

Resultado:
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.

Esta visualização está tentando fazer referência a c1 mas essa coluna foi renomeada e, portanto, não há colunas com esse nome na tabela.

A definição desta view é assim:
CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;

Precisaríamos atualizar essa visualização para referenciar o novo nome da coluna. Então poderíamos fazer isso:
ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;

Agora, consultar a exibição retornará os dados corretos.

Portanto, antes de renomear qualquer coluna, você deve sempre verificar scripts e procedimentos armazenados que fazem referência a essa coluna. Você precisará atualizar esses scripts e procedimentos para fazer referência ao novo nome da coluna.

Você pode usar o sys.sql_expression_dependencies visão do catálogo do sistema para fazer essa verificação.

Renomeando colunas computadas


O SQL Server não nos permite renomear colunas computadas.

Se você tentar renomear uma coluna computada, provavelmente verá a seguinte mensagem de erro.
EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';

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

Neste caso, o c3 column é uma coluna computada que faz um cálculo com base em um valor no c2 coluna.

Veja o que acontece quando tentamos renomear o c2 coluna.
EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';

Resultado:
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.

Obtemos um erro diferente para esta coluna. Esse erro ocorre porque a coluna computada depende dessa coluna.

Basicamente, para renomear a coluna computada, precisaríamos eliminá-la e adicioná-la novamente.

Exemplo:
ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Chaves estrangeiras


Renomear uma coluna de chave primária não quebra nenhuma chave estrangeira que faça referência a essa coluna.

Por exemplo, antes de renomear t1.c1 para t1.c11 , embora eu não tenha mencionado isso, na verdade eu tinha outra tabela e coluna (t2.c2 ) que fazia referência a t1.c1 .

Após renomear t1.c1 para t1.c11 , a restrição de chave estrangeira em t2.c2 ainda estava impondo quaisquer novas inserções para cumprir a chave estrangeira, mesmo que a coluna de chave primária na outra tabela tivesse seu nome alterado.