sql >> Base de Datos >  >> RDS >> Sqlserver

Cambiar el nombre de una columna en SQL Server (T-SQL)

En SQL Server, puede usar sp_rename procedimiento almacenado para cambiar el nombre de un objeto, incluida una columna.

Ejemplo

Aquí hay un ejemplo para demostrarlo:

EXEC sp_rename 't1.c1', 'c11';

Esto cambia el nombre de la columna llamada c1 (en el t1 tabla) a c11 .

Incluyendo el tipo de objeto

También puede incluir el tipo de objeto como tercer argumento. En este caso, podemos usar COLUMN :

EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';

Incluir el nombre del esquema

También puede calificar la primera columna con el nombre del esquema, en cuyo caso, podría verse así:

EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';

En este ejemplo, dbo es el nombre del esquema, pero deberá usar el esquema aplicable.

Incluir los nombres de los parámetros

Al igual que con cualquier procedimiento almacenado, también puede incluir los nombres de los parámetros al llamar a sp_rename :

EXEC sp_rename 
    @objname = 'dbo.t1.c1',
    @newname = 'c11',
    @objtype = 'COLUMN';

Buscar referencias

Cuando cambie el nombre de una columna en SQL Server, probablemente verá un mensaje como este:

Caution: Changing any part of an object name could break scripts and stored procedures.

Esto se debe a que cuando cambia el nombre de una columna, SQL Server no cambia automáticamente el nombre de cualquier referencia a esa columna. Esto también es cierto cuando cambia el nombre de una tabla.

A pesar del mensaje de advertencia anterior, se cambia el nombre de la columna de todos modos.

Si intentamos consultar una vista que hace referencia a la columna renombrada, obtenemos un error.

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 vista intenta hacer referencia a c1 pero se ha cambiado el nombre de esa columna, por lo que no hay columnas con ese nombre en la tabla.

La definición de esta vista se ve así:

CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;

Tendríamos que actualizar esta vista para hacer referencia al nuevo nombre de columna. Así que podríamos hacer esto:

ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;

Ahora consultar la vista devolverá los datos correctos.

Por lo tanto, antes de cambiar el nombre de cualquier columna, siempre debe buscar secuencias de comandos y procedimientos almacenados que hagan referencia a esa columna. Deberá actualizar dichos scripts y procedimientos para hacer referencia al nuevo nombre de columna.

Puede usar sys.sql_expression_dependencies vista de catálogo del sistema para realizar esta comprobación.

Renombrar columnas calculadas

SQL Server no nos permite cambiar el nombre de las columnas calculadas.

Si intenta cambiar el nombre de una columna calculada, probablemente verá el siguiente mensaje de error.

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

En este caso, el c3 columna es una columna calculada que realiza un cálculo basado en un valor en el c2 columna.

Esto es lo que sucede cuando intentamos cambiar el nombre del c2 columna.

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.

Obtenemos un error diferente para esta columna. Este error se debe a que la columna calculada depende de esta columna.

Básicamente, para cambiar el nombre de la columna calculada, tendríamos que soltarla y agregarla nuevamente.

Ejemplo:

ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Claves foráneas

Cambiar el nombre de una columna de clave principal no rompe ninguna clave externa que haga referencia a esa columna.

Por ejemplo, antes de cambiar el nombre de t1.c1 a t1.c11 , aunque no lo mencioné, en realidad tenía otra tabla y columna (t2.c2 ) que hacía referencia a t1.c1 .

Después de cambiar el nombre de t1.c1 a t1.c11 , la restricción de clave externa en t2.c2 todavía estaba imponiendo nuevas inserciones para cumplir con la clave externa, a pesar de que la columna de clave principal en la otra tabla había cambiado de nombre.