¿Cómo cambiar el nombre de una tabla en SQL Server?

370

La SQLconsulta que he usado es:

ALTER TABLE oldtable RENAME TO newtable;

Pero, me da un error.

Servidor: Mensaje 156, Nivel 15, Estado 1, Línea 1
Sintaxis incorrecta cerca de la palabra clave 'TO'.

Cambiar
fuente

Respuestas:

683

Para cambiar el nombre de una tabla en SQL Server, use el sp_renamecomando:

exec sp_rename 'schema.old_table_name', 'new_table_name'
Jeff Hornby
fuente
77
Una cosa más: si alguno de los nombres de la tabla tiene un nombre ., úselo []alrededor del nombre de la tabla. (Lo sé, lo sé, pero pueden suceder puntos ...) Por ejemplo, sp_rename '[Stupid.name]', 'NewName'o con un esquemasp_rename '[dbo.Stupid.name]', 'NewName'
vacip
55
Y para agregar, no coloque accidentalmente el esquema en el 'NewName'campo, de lo contrario su tabla podría terminar pareciendo algo así dbo.dbo.NewName.
Michael Plautz el
44
Tenga en cuenta que al cambiar el nombre de una tabla, es casi seguro que también desee cambiar el nombre de cualquier referencia a esa tabla que pueda existir en procedimientos almacenados, vistas, funciones, etc. Un google rápido puede encontrar una de las muchas herramientas que pueden hacer esto por usted . O puede usar un script que encuentre una cadena dada en todos estos objetos, y pegarlos como declaraciones ALTER, y hacer una búsqueda y reemplazar, luego ejecutarlos todos.
MGOwen
2
También puede crear un sinónimo con el nombre del antiguo nombre de la tabla que apunta a la nueva tablaCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin el
¡no coloque un nuevo nombre entre corchetes! de lo contrario, la tabla tendrá corchetes EN el nombre. Entonces: 'new_table_name' - es correcto, '[new_table_name]' - te meterá en problemas
VeganHunter
143

Para renombrar una columna:

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

Para renombrar una tabla:

sp_rename 'old_table_name','new_table_name';
Ravi Kumar
fuente
No explica cómo manejar esquemas que no sean el dbo predeterminado.
Sal
1
@Sal ¿No menos que cualquier otra respuesta aquí? ¿Estaba buscando cómo cambiar el esquema de una tabla ?
Bacon Bits
14

Cuando use sp_rename que funciona como en las respuestas anteriores, verifique también qué objetos se ven afectados después de cambiar el nombre, esa referencia a esa tabla, porque también necesita cambiarlos

Tomé un ejemplo de código para las dependencias de la tabla en el blog de Pinal Dave aquí

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'

Por lo tanto, todos estos objetos dependientes también deben actualizarse

O use algún complemento si puede, algunos de ellos tienen la función de cambiar el nombre del objeto, y todos dependen también de los objetos


fuente
11

Si intentas exec sp_rename y recibe un error de LockMatchID, entonces podría ser útil agregar primero una declaración de uso [base de datos]:

Lo intenté

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

Lo que tuve que hacer para arreglarlo fue reescribirlo en:

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

Nombre de la tabla

sp_rename 'db_name.old_table_name', 'new_table_name'

Columna

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

Índice

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

también disponible para estadísticas y tipos de datos

budamivardi
fuente
2
Para Column te falta una coma entre el primer y el segundo parámetro. Debería ser: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu
7

Esto es lo que uso:

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

Nada funcionó a partir de lo propuesto aquí. Así que solo introduje los datos en una nueva tabla

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

tal vez sea útil para alguien ...

En mi caso no reconocía el nuevo esquema, también el dbo era el propietario.

ACTUALIZAR

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

Trabajó para mi. Lo encontré en el script generado automáticamente al actualizar el PK para una de las tablas. De esta manera, también reconoció el nuevo esquema.

Tzvi Gregory Kaidanov
fuente
0

Para cambiar el nombre de una tabla con un esquema diferente:

Ejemplo: cambie dbo.MyTable1 a wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
vive el amor
fuente