Pregunta ¿Cómo verificar si existe una columna en una tabla de SQL Server?


Necesito agregar una columna específica si no existe. Tengo algo como lo siguiente, pero siempre devuelve falso:

IF EXISTS(SELECT *
          FROM   INFORMATION_SCHEMA.COLUMNS
          WHERE  TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName') 

¿Cómo puedo verificar si existe una columna en una tabla de la base de datos de SQL Server?


1567
2017-09-25 12:34


origen


Respuestas:


SQL Server 2005 en adelante:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

La versión de Martin Smith es más corta:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

1722
2017-09-25 12:39



Una versión más concisa

 IF COL_LENGTH('table_name','column_name') IS NULL
 BEGIN
 /*Column does not exist or caller does not have permission to view the object*/
 END

El punto acerca de los permisos para ver los metadatos se aplica a todas las respuestas, no solo a esta.

Tenga en cuenta que el primer nombre de tabla de parámetros para COL_LENGTH puede estar en formato de nombre de una, dos o tres partes según sea necesario.

Un ejemplo que hace referencia a una tabla en una base de datos diferente es

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

Una diferencia con esta respuesta en comparación con el uso de las vistas de metadatos es que las funciones de metadatos como COL_LENGTH siempre solo devuelve datos sobre cambios comprometidos independientemente del nivel de aislamiento vigente.


853
2018-03-20 14:47



Ajusta el siguiente para adaptarlo a tus requisitos específicos:

if not exists (select
                     column_name
               from
                     INFORMATION_SCHEMA.columns
               where
                     table_name = 'MyTable'
                     and column_name = 'MyColumn')
    alter table MyTable add MyColumn int

Editar para tratar la edición a la pregunta: Eso debería funcionar; mire detenidamente su código para detectar errores estúpidos; ¿Está consultando INFORMATION_SCHEMA en la misma base de datos a la que se está aplicando su inserción, por ejemplo? ¿Tiene un error tipográfico en el nombre de su tabla / columna en cualquier declaración?


125
2017-09-25 12:35



Prueba esto...

IF NOT EXISTS(
  SELECT TOP 1 1
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE 
    [TABLE_NAME] = 'Employees'
    AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
  ALTER TABLE [Employees]
    ADD [EmployeeID] INT NULL
END

63
2017-09-25 12:35



preferiría INFORMATION_SCHEMA.COLUMNS sobre una tabla del sistema porque Microsoft no garantiza preservar las tablas del sistema entre las versiones. Por ejemplo, dbo.syscolumns todavía funciona en SQL 2008, pero está en desuso y podría eliminarse en cualquier momento en el futuro.


43
2018-06-26 08:58



Puede usar las vistas del sistema de esquema de información para descubrir casi cualquier cosa sobre las tablas que le interesan:

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'yourTableName'
 ORDER BY ORDINAL_POSITION

También puede interrogar vistas, procedimientos almacenados y casi cualquier cosa sobre la base de datos utilizando las vistas de Information_schema.


38
2017-09-25 12:37



Primero compruebe si el table/column(id/name) la combinación existe en dbo.syscolumns (una tabla interna de SQL Server que contiene definiciones de campo), y si no se emite el apropiado ALTER TABLE consulta para agregarlo. Por ejemplo:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

28
2017-09-25 12:38



Pruebe algo como:

CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
    SET @Result = 'T'
END
ELSE
BEGIN
    SET @Result = 'F'
END
RETURN @Result;
END
GO

GRANT EXECUTE ON  [ColumnExists] TO [whoever]
GO

Entonces úsalo así:

IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
  ALTER TABLE xxx
  ADD yyyyy varChar(10) NOT NULL
END
GO

Debería funcionar en SQL Server 2000 y SQL Server 2005. No estoy seguro acerca de SQL Server 2008, pero no veo por qué no.


26
2018-05-01 04:46



Para las personas que están verificando la existencia de la columna para soltarlo.

En SQL Server 2016 puedes usar nuevas sentencias DIE en lugar de grandes IF envoltorios

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

24
2018-03-03 15:49