Problema: Tienes una o más columnas en una tabla de SQL Server que son obsoletas y ya no son necesarias que necesitas eliminar.
Solución: Las columnas se eliminan con la instrucción ALTER TABLE NOMBRE_DE_LA_TABLA DROP COLUMN. Los siguientes ejemplos mostrarán cómo hacer lo siguiente en SQL Server Management Studio y a través de T-SQL:
- Eliminar una columna
- Eliminar múltiples columnas
- Verificar si una columna existe antes de intentar eliminarla
- Eliminar una columna si hay una restricción de clave primaria o clave externa en ella
Versiones de SQL Server utilizadas en este tutorial de SQL: Microsoft SQL Server 2019 (RTM-CU8), SQL Server Management Studio 18.8
Configuración del ejemplo
Para comenzar, he creado dos nuevas tablas en MyDatabase. Una se llama Employees y la otra se llama EmployeeStatus. Ambas están pobladas con algunos datos de muestra con varios tipos de datos. Por último, agregué una restricción de clave externa en Employees que hace referencia a EmployeeStatus.
-- usar MyDatabase
USE [MyDatabase];
-- crear tabla [dbo].[Employees]
CREATE TABLE [dbo].[Employees] (
[EmployeeID] [int] IDENTITY (1, 1) NOT NULL,
[LastName] [varchar](100) NOT NULL,
[FirstName] [varchar](100) NOT NULL,
[MiddleName] [varchar](100) NULL,
[Title] [varchar](50) NULL,
[TitleOfCourtesy] [varchar](20) NULL,
[BirthDate] [date] NULL,
[HireDate] [date] NULL,
[TerminationDate] [date] NULL,
[RehireDate] [date] NULL,
[Address] [varchar](100) NULL,
[City] [varchar](100) NULL,
[Region] [varchar](100) NULL,
[PostalCode] [varchar](100) NULL,
[Country] [varchar](50) NULL,
[HomePhone] [varchar](100) NULL,
[Extension] [varchar](10) NULL,
[Notes] [varchar](max) NULL,
[ReportsTo] [int] NULL,
[PhotoPath] [varchar](500) NULL,
[EmployeeStatusID] [int] NULL,
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED ([EmployeeID])
);
-- insertar algunos valores de empleados de muestra
INSERT INTO [dbo].[Employees] VALUES
('Smith', 'William', 'A', 'CEO', 'Bill', '1960-01-01', '1990-07-01', '', '', '100 Main St', 'Boston', 'MA', '02210', 'USA', '123-456-7890', '', '', '', '', 1),
('Jones', 'Thomas', 'J', 'IT Director', 'Tom', '1950-02-28', '1999-08-15', '', '', '25 Main St', 'Cambridge', 'MA', '02138', 'USA', '123-678-9012', '', '', '', '', 2);
-- crear tabla [dbo].[EmployeeStatus]
CREATE TABLE [dbo].[EmployeeStatus] (
[StatusID] [int] IDENTITY (1, 1) NOT NULL,
[StatusName] [varchar](50) NULL,
CONSTRAINT [PK_EmployeeStatus] PRIMARY KEY CLUSTERED ([StatusID])
);
-- insertar algunos valores de estado de empleados de muestra
INSERT INTO [dbo].[EmployeeStatus] VALUES
('Actualmente empleado'),
('Jubilado'),
('Despedido'),
('Licencia médica');
-- agregar clave externa a empleados que hace referencia al estado del empleado
ALTER TABLE [dbo].[Employees] ADD CONSTRAINT [FK_Employees_EmployeeStatus] FOREIGN KEY ([EmployeeStatusID]) REFERENCES [dbo].[EmployeeStatus] ([StatusID]);
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[EmployeeStatus];
Así es como se ven nuestras dos tablas:
| EmployeeID | LastName | FirstName | MiddleName | Title | TitleOfCourtesy | BirthDate | HireDate | TerminationDate | RehireDate | Address | City | Region | PostalCode | Country | HomePhone | Extension | Notes | ReportsTo | PhotoPath | EmployeeStatusID |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Smith | William | A | CEO | Bill | 1960-01-01 | 1990-07-01 | 100 Main St | Boston | MA | 02210 | USA | 123-456-7890 | 1 | ||||||
| 2 | Jones | Thomas | J | IT Director | Tom | 1950-02-28 | 1999-08-15 | 25 Main St | Cambridge | MA | 02138 | USA | 123-678-9012 | 2 |
Ejemplo de ELIMINAR COLUMNA en SSMS
Aquí eliminaremos la columna ReportsTo desde el Explorador de objetos de Management Studio:
- Expandir la base de datos
- Expandir la tabla
- Expandir la columna
- Hacer clic derecho en la columna a eliminar
- Eliminar
- Aceptar
O ejecutar el comando SQL en la siguiente declaración:
-- eliminar la columna ReportsTo de la tabla Employees
ALTER TABLE [dbo].[Employees] DROP COLUMN [ReportsTo];
GO
SELECT * FROM [dbo].[Employees];
GO
Ejemplos de ELIMINAR COLUMNA – Múltiples columnas
Para eliminar las columnas PhotoPath y Notes utilizando el Explorador de objetos requeriría eliminar cada columna individualmente como hemos visto anteriormente. Para ejecutar el T-SQL directamente, solo es cuestión de colocar los nombres de las columnas después de DROP COLUMN separados por comas, y se pueden eliminar varias columnas en un solo paso con la instrucción ALTER TABLE.
-- eliminar las columnas PhotoPath y Notes de la tabla Employees
ALTER TABLE [dbo].[Employees] DROP COLUMN [PhotoPath], [Notes];
GO
SELECT * FROM [dbo].[Employees];
GO
Verificar si la columna existe antes de eliminarla con ALTER TABLE DROP COLUMN IF EXISTS
Es probable que no desees que tu script falle y genere un error. Para evitar eso, será necesario verificar si la columna existe primero. Aquí, verificaremos si la columna Extension existe.
En el Explorador de objetos:
- Hacer clic derecho en Columnas
- Actualizar
La columna Extension que existe en la lista actualizada es una verificación de que existe. Para eliminar la columna Extension, simplemente hacemos clic derecho en ella y la eliminamos como antes.
Hay un par de formas de eliminarla programáticamente con T-SQL dependiendo de la versión de SQL Server en la que te encuentres. La primera forma, que funcionará en todas las versiones compatibles, es verificar la vista sys.columns para ver si existe primero y ejecutar ALTER TABLE DROP COLUMN solo si existe.
-- eliminar la columna Extension si existe - todas las versiones de SQL Server
IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Extension' AND OBJECT_ID = OBJECT_ID('[dbo].[Employees]'))
ALTER TABLE [dbo].[Employees] DROP COLUMN [Extension];
GO
SELECT * FROM [dbo].[Employees];
GO
Si la columna no existiera, la instrucción DROP COLUMN simplemente se ignoraría.
SQL Server 2016 y versiones posteriores agregan el
</