Renombrar columna SQL Server 2008

653

Estoy usando SQL Server 2008 y Navicat. Necesito cambiar el nombre de una columna en una tabla usando SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Esta afirmación no funciona.

Serhio g. Lazin
fuente
55
Tenga en cuenta que este no es un duplicado de la pregunta # 174582 que swetha enlazó: esta es específica de MS SQL, esa es independiente de la base de datos.

Respuestas:

1195

Utilizar sp_rename

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

Consulte: SERVIDOR SQL: cómo cambiar el nombre de una columna o de una tabla

Documentación: sp_rename (Transact-SQL)

Para su caso sería:

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

Recuerde usar comillas simples para encerrar sus valores.

Habib
fuente
24
Tenga en cuenta que no debe poner NewColumnName entre paréntesis, ya que SQL Server usará [[[NewColumnName]]] como el nombre de la nueva columna. Además, sp_rename debe tener el prefijo EXEC o EXECUTE.
Mark Freeman
29
Se le permite y alienta poner corchetes en el primer parámetro, identificando la columna, pero no en el segundo parámetro. Así:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch
2
Debe tener en cuenta en su respuesta que estos valores predeterminados de asas de procedimientos almacenados, etc nulos contraints mientras se hace el cambio de nombre, en lugar de una llanura alter tableque pueden fallar si existen tales restricciones.
Tuncay Göncüoğlu
44
Tenga en cuenta que si utiliza 'nombre_tabla.nombre_nuevo', se convierte en [esquema]. [Nombre_tabla]. [Nombre_tabla.nombre_nuevo], ¡así que no ponga ese nombre de tabla en el nuevo nombre! (es correcto en esta respuesta, simplemente agregando una nota para píos)
Mark Schultheiss
1
Si hay un esquema en la base de datos, debe poner el nombre del esquema antes del nombre de la tabla: EXEC sp_RENAME 'schema_name.table_name.old_name', 'new_name', 'COLUMN'
amin
106

Alternativamente SQL, puede hacerlo en Microsoft SQL Server Management Studio. Aquí hay algunas formas rápidas de usar la GUI:

Primera forma

Haga doble clic lento en la columna. El nombre de la columna se convertirá en un cuadro de texto editable.


Segunda forma

Haga clic derecho en la columna y elija Cambiar nombre en el menú contextual.

Por ejemplo:

Para cambiar el nombre de la columna


Tercera forma

De esta manera es preferible cuando necesita cambiar el nombre de varias columnas de una vez.

  1. Haga clic derecho en la tabla que contiene la columna que necesita cambiar de nombre.
  2. Haga clic en diseño .
  3. En el panel de diseño de la tabla, haga clic y edite el cuadro de texto del nombre de la columna que desea modificar.

Por ejemplo: Ejemplo de diseño de tabla MSSMS

NOTA: Sé que OP solicitó específicamente una solución SQL, pensé que esto podría ayudar a otros :)

Carrie Kendall
fuente
1
O el usuario no tiene los privilegios.
Carrie Kendall
66
Nunca hagas eso. Está copiando la tabla, luego descartando la antigua y renombrándola. NUNCA use la GUI NUNCA para cambiar algo de una tabla.
HLGEM
66
@HLGEM esa es una declaración general bastante grande. En cualquier caso, ¿puede proporcionar algún recurso para lo que ha explicado? es decir, dejar la mesa, etc.
Carrie Kendall
2
@CarrieKendall, escribe el cambio desde la GUI en lugar de hacerlo y verás. Esta es la razón por la cual es mucho más lento hacer un cambio usando la GUI en una tabla grande que usando sp_rename o alter table. Además, los cambios en la estructura de la base de datos son cambios en el código y deben estar en el control de origen como otros códigos, por lo que deben estar en un script. Esto es especialmente importante si no permite que los derechos de la base de datos de producción de desarrollo cambien las tablas porque necesitará el script en cualquier caso. Y no desea copiar, soltar y volver a crear tablas con millones de registros en producción.
HLGEM
18
Acabo de cambiar el nombre de una tabla de SQL Server 2012 usando Management Studio con el generador de perfiles en ejecución y usé sp_rename. Sin embargo, no puedo hablar de versiones anteriores.
Steve Dowling
58

Tratar:

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

También debe especificar el esquema de la tabla o puede obtener este error:

Mensaje 15248, Nivel 11, Estado 1, Procedimiento sp_rename, Línea 238 O bien el parámetro @objname es ambiguo o el @objtype (COLUMNA) reclamado es incorrecto.

Si se trata de un script de implementación, también recomendaría agregarle seguridad adicional.

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
fuente
Me gusta este enfoque seguro, bueno para escribir migraciones que pueden o no ejecutarse en diferentes entornos.
Adil H. Raza el
Al igual que la verificación de existencia, me hace sentir bien volver a ejecutar como parte de un lote de otros scripts
desconocido el
19

Sería una buena sugerencia utilizar una función ya incorporada, pero otra forma de hacerlo es:

  1. Cree una nueva columna con el mismo tipo de datos y NUEVO NOMBRE.
  2. Ejecute una instrucción UPDATE / INSERT para copiar todos los datos en una nueva columna.
  3. Suelta la vieja columna.

El beneficio detrás de usar el sp_renamees que se encarga de todas las relaciones asociadas con él.

De la documentación :

sp_rename cambia automáticamente el nombre del índice asociado cada vez que se cambia el nombre de una restricción PRIMARY KEY o UNIQUE. Si un índice renombrado está vinculado a una restricción PRIMARY KEY, la restricción PRIMARY KEY también se renombra automáticamente mediante sp_rename. sp_rename se puede usar para renombrar índices XML primarios y secundarios.

Nunca sin esperanza
fuente
* En el paso 1, se debe permitir NULL en la nueva columna * Opcionalmente, agregue el 4to paso para cambiar la nueva columna, que no permita valores NULL
BitLauncher
16

Puede usar sp_renamepara cambiar el nombre de una columna.

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

El primer parámetro es el objeto a modificar, el segundo parámetro es el nuevo nombre que se le dará al objeto, y el tercer parámetro COLUMN informa al servidor que el cambio de nombre es para el column, y también se puede usar para cambiar el nombre tables, indexy alias data type.

Alexandre Neukirchen
fuente
2
No entiendo, ¿por qué agregas una nueva respuesta incluso por encima de 4 de 5 mención sobre sp_rename ...?
Pawel Czapski
3
En algún momento, alguien tendría que explicar aquí el funcionamiento del parámetro, nadie hizo esto
Alexandre Neukirchen
1
Sí, en realidad tienes razón, para mí es muy obvio, pero para los nuevos muchachos podría no serlo.
Pawel Czapski
12

Como a menudo vengo aquí y luego me pregunto cómo usar los corchetes, esta respuesta podría ser útil para personas como yo.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • El OldColumnNameno debe estar adentro []. No funcionará.
  • No ponga NewColumnNameen [], que se traducirá en [[NewColumnName]].
HonzaB
fuente
3

Sql Server Management Studio tiene algunos procedimientos almacenados (SP) definidos por el sistema,
uno de los cuales se utiliza para cambiar el nombre de una columna. El SP es sp_rename

Sintaxis: sp_rename '[nombre_tabla] .old_column_name', 'new_column_name'
Para obtener más ayuda, consulte este artículo: sp_rename por Microsoft Docs

Nota: Al ejecutar este SP, el servidor sql le dará un mensaje de precaución como ' Precaución: cambiar cualquier parte del nombre de un objeto podría romper los scripts y los procedimientos almacenados '. Esto es crítico solo si ha escrito su propio sp que involucra la columna en la tabla que estás a punto de cambiar.

Tahir77667
fuente
2

Versión mejorada de @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
fuente
0

O simplemente puede hacer clic dos veces lentamente en la columna en SQL Management Studio y cambiarle el nombre a través de la interfaz de usuario ...

Dave Cole
fuente
-1

Ejecutar consulta:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'
Purnima Bhatia
fuente
Por favor, no repita las respuestas antiguas y existentes con muchos votos positivos.
TT.