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

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

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

La mayoría de los otros RDBM principales le permiten cambiar el nombre de una tabla con ALTER TABLE declaración, pero este no es el caso con SQL Server.

Ejemplo

Aquí hay un ejemplo para demostrarlo:

EXEC sp_rename 't1', 't2';

Esto cambia el nombre de la tabla llamada t1 a t2 .

Incluir el nombre del esquema

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

EXEC sp_rename 'dbo.t1', 't2';

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',
    @newname = 't2';

El sp_rename procedimiento también acepta un @objtype parámetro, pero esto no es necesario (o compatible) al cambiar el nombre de las tablas.

Buscar referencias

Cuando cambie el nombre de una tabla 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 tabla, SQL Server no cambia automáticamente el nombre de cualquier referencia a esa tabla. Esto también es cierto cuando cambia el nombre de una columna.

A pesar del mensaje de advertencia anterior, la tabla se renombra de todos modos.

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

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

Ejemplo:

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't1');

En este caso lo uní con sys.objects para devolver más información.

Aquí está el resultado que obtuve antes de cambiar el nombre del t1 tabla:

+----------------------+----------------------+----------+---------------------+----------+
 | Referencing Entity   | Type                 | Column   | Referenced Entity   | Column   |
 |----------------------+----------------------+----------+---------------------+----------|
 | usp_t1               | SQL_STORED_PROCEDURE | (n/a)    | t1                  | (n/a)    |
 | vt1                  | VIEW                 | (n/a)    | t1                  | (n/a)    |
 | t1                   | USER_TABLE           | c2       | t1                  | c1       |
 +----------------------+----------------------+----------+---------------------+----------+ 

Esto me muestra que hay una vista, un procedimiento almacenado y una columna calculada que depende del t1 mesa. La columna calculada (c2 ) hace referencia al c1 columna en la misma tabla.

Como se mencionó, es importante ejecutar esta verificación antes de cambiar el nombre de la tabla. Este es el resultado que obtengo al ejecutar el mismo script después de cambiar el nombre de la tabla.

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't1');

Resultado:

(0 rows affected) 

En este caso, usé el nombre original de la tabla (t1 ), por lo que es bastante obvio que ni siquiera apuntamos a la tabla correcta (t2 ).

Simplemente cambiar este script para hacer referencia al nuevo nombre de la tabla tampoco funcionará. Por ejemplo, ejecutar el siguiente script después de haber cambiado el nombre de la tabla de t1 a t2 devuelve solo una dependencia (la columna calculada).

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't2');

Resultado:

+----------------------+------------+----------+---------------------+----------+
 | Referencing Entity   | Type       | Column   | Referenced Entity   | Column   |
 |----------------------+------------+----------+---------------------+----------|
 | t2                   | USER_TABLE | c2       | t2                  | c1       |
 +----------------------+------------+----------+---------------------+----------+ 

La buena noticia es que se devuelve la columna calculada. La mala noticia es que la vista y el procedimiento almacenado no se devuelven.

En pocas palabras:verifique las dependencias antes de cambiar el nombre de la tabla. Luego actualice manualmente cualquier objeto que haga referencia a la tabla renombrada.