¿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?

preguntado el 25 de septiembre de 08 a las 10:09

En realidad, no creo que haya nada de malo en el código de la pregunta: funciona muy bien para mí en 2008 R2. (¿Quizás lo estaba ejecutando en la base de datos incorrecta? ¿Quizás su base de datos distingue entre mayúsculas y minúsculas y no tenía el caso correcto en sus cadenas myTableName / myColumnName? Este tipo de consulta parece más flexible que la solución COL_LENGTH: puedo para ejecutarlo contra una base de datos diferente e incluso sobre un enlace de base de datos con el prefijo adecuado "INFORMATION_SCHEMA". No pude ver cómo hacer eso con la función de metadatos COL_LENGTH. -

@mwardm- COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate') funciona bien. -

Pequeña pista relacionada: si desea actualizar una columna justo después de la adición de la columna (creo que muchos usuarios estaban buscando este artículo para ese propósito), puede usar EXEC sp_executesql con formado UPDATE declaración. -

La respuesta real es que debe agregar la base de datos con la que está comprobando para que sea FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS -

También puede utilizar syscolumns y sysobjects de forma muy sencilla. -

30 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

Respondido 12 Abr '17, 04:04

En la versión de Martin Smith, una cosa a mencionar es no incluir columnName entre corchetes []. Cuando columnName está entre corchetes [], dará un valor nulo incluso si la columna existe en la tabla - Hemendra

@HemendraSinghChauhan, eso es porque no son parte del nombre. También encontrará que al comparar con el nombre en sys.columns - Martin Smith

@MartinSmith no sabía eso, estaba usando tu respuesta y encontré esto. Generalmente uso corchetes al agregar columnas, así que también los usé dentro de la función COL_LENGTH. Mi código era así: Alter table Table_Name Add [ColumnName] NVarchar(max) NULL; Select COL_LENGTH('[TABLE_NAME]', '[COLUMN_NAME]') - Hemendra

sí, eso no es válido. Los argumentos para COL_LENGTH necesita estar sin comillas. Teóricamente es posible que alguien cree una columna que realmente tenga un nombre de [COLUMN_NAME] - p.ej CREATE TABLE #T([[COLUMN_NAME]]] INT); SELECT * FROM #T y luego sería ambiguo si esta no fuera la regla. - Martin Smith

La versión más corta no funciona cuando el campo id varchar (max) = nulo - AlejandroDG

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 sobre los permisos para ver metadatos se aplica a todas las respuestas, no solo a esta.

Tenga en cuenta que el primer nombre de la tabla de parámetros 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 los metadatos funcionan como COL_LENGTH siempre solo devuelve datos sobre cambios comprometidos independientemente del nivel de aislamiento en vigor.

Respondido 22 Oct 18, 08:10

Esto es menos legible que algunas de las otras respuestas, probablemente por qué no tiene una calificación tan alta. - proyecto de ley yang

@Bill - ¿Menos legible de qué manera? Se ve bien en Firefox. Esta respuesta se publicó más de 2 años después de la aceptada, lo que explica la calificación IMO. Si quiso decir menos claro que es una existencia, verifique que este tipo de lenguaje es bastante común en SQL Server. por ejemplo, usando IF OBJECT_ID('TableName','U') IS NULL para comprobar la existencia del objeto o DB_ID('foo') para comprobar la existencia de la base de datos. - Martin Smith

@MartinSmith Estoy seguro de que se refería a menos legible porque si no conocieras este idioma y heredaras este código de otra persona, no entenderías de inmediato lo que hace el código. Como escribir x>>2 en lugar de x/4 en C ++. El código más detallado (if exists (select column_name from information_schema ...)) ocupa mucho más espacio, pero nadie se rascaría la cabeza tratando de averiguar qué hace. - Kip

Además de ser más conciso, esta es una solución mucho más rápida. Accediendo INFORMATION_SCHEMA vistas o sys.columns golpea el disco, mientras COL_LENGTH utiliza metadatos de la base de datos en caché. - wqw

Probablemente esta no sea la respuesta mejor calificada porque se dio 2.5 años después de la otra. Es por eso que siempre verifico las fechas cuando comparo las calificaciones en dos respuestas. Se necesita mucho más tiempo para superar una respuesta que se dio mucho antes. ;) - Sean

Modifique lo siguiente para que se adapte a sus 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 con editar para pregunta: Eso debería funcionar - revise cuidadosamente su código en busca de errores estúpidos; ¿está consultando INFORMACIÓN_SCHEMA en la misma base de datos a la que se aplica su inserción, por ejemplo? ¿Tiene un error tipográfico en el nombre de su tabla / columna en alguna de las declaraciones?

Respondido el 31 de diciembre de 14 a las 08:12

Acabo de descubrir que agregar TABLE_SCHEMA = 'mySchema' después de donde la cláusula soluciona el problema. - Maciej

-1: no responde a la pregunta de OP, solo agrega la nueva información sobre cómo agregar una nueva columna a pesar de que OP no pregunta sobre eso en absoluto, no aborda el comentario de OP. - ANeves piensa que SE es malvado

+1 Responde a la pregunta de OP perfectamente con una bonificación de la información adicional que el OP estaba buscando a continuación de todos modos. Y esto era lo que estaba buscando. - Azul amargo

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

respondido 14 nov., 11:07

Este método también funciona con SQL CE, mientras que algunos de los otros métodos mencionados no lo hacen. - Tragamonedas

Puedes usar SELECT 1 en lugar de SELECT TOP 1 1 ;). - mierda

Dentro de un EXISTS declaración SQL optimiza automáticamente las columnas (al igual que count(*)) entonces SELECT * Será suficiente. - Marc L.

En aras de la integridad, debería considerar agregar and [TABLE_SCHEMA] = '???' a la cláusula WHERE. - andres jens

Para las personas que están comprobando la existencia de la columna antes de dejarla caer.

Desde SQL Server 2016 puede usar nuevas declaraciones DIE en lugar de grandes IF envolvedoras

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Respondido 18 Feb 21, 15:02

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

Respondido el 26 de junio de 09 a las 09:06

Pues sí, eso no hace falta decirlo desde INFORMATION_SCHEMA Las vistas contienen solo metadatos estándar ANSI. Sin embargo, eso es suficiente para una prueba de existencia. - Christian Hayter

Microsoft dice "En versiones futuras de SQL Server, Microsoft puede aumentar la definición de cualquier vista de catálogo del sistema agregando columnas al final de la lista de columnas. Recomendamos no usar la sintaxis SELECT * FROM sys.catalog_view_name en el código de producción porque el número de las columnas devueltas pueden cambiar e interrumpir su aplicación ". Eso implica que no eliminarán columnas ni cambiarán su orden. Eso es lo suficientemente buena compatibilidad con versiones anteriores para todos los casos excepto los extremos. - sirir

Puede utilizar las vistas del sistema de esquema de información para averiguar prácticamente 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 prácticamente cualquier cosa sobre la base de datos utilizando las vistas Information_schema.

Respondido el 25 de Septiembre de 08 a las 13:09

Esto es exactamente lo que está usando el cuestionario, necesitaba saber cómo agregar la columna si no existía. - Birel

Intenta 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 tanto en SQL Server 2000 como en SQL Server 2005. No estoy seguro acerca de SQL Server 2008, pero no veo por qué no.

Respondido el 15 de junio de 15 a las 13:06

Primero compruebe si el table/column(id/name) combinación existe en dbo.syscolumns (una tabla interna de SQL Server que contiene definiciones de campo) y, de no ser así, emita el 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

Respondido el 15 de junio de 15 a las 13:06

Un buen amigo y colega me enseñó cómo también se puede utilizar un IF bloque con funciones SQL OBJECT_ID y COLUMNPROPERTY en SQL SERVER 2005+ para buscar una columna. Puede usar algo similar a lo siguiente:

Puedes verlo por ti mismo aquí

IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
    COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
    SELECT 'Column does not exist -- You can add TSQL to add the column here'
END

respondido 21 mar '13, 17:03

Y, por supuesto, si está seguro de que la tabla existe, puede omitir la primera parte de la condición y verificar COLUMNPROPERTY solo. - ruud helderman

declare @myColumn   as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
    select  1
    from    information_schema.columns columns 
    where   columns.table_catalog   = 'myDatabase'
        and columns.table_schema    = 'mySchema' 
        and columns.table_name      = 'myTable' 
        and columns.column_name     = @myColumn
    )
begin
    exec('alter table myDatabase.mySchema.myTable add'
    +'    ['+@myColumn+'] bigint       null')
end

respondido 03 mar '11, 15:03

Esto funcionó para mí en SQL 2000:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END

respondido 23 mar '17, 19:03

Prueba esta

SELECT COLUMNS.*
FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,
       INFORMATION_SCHEMA.TABLES TABLES
WHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
       AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name') 

Respondido el 21 de diciembre de 14 a las 14:12

No necesitas INFORMATION_SCHEMA.TABLES y no filtra columnas para una tabla específica, por lo que a veces devolverá más de una fila para los mismos nombres de columna en tablas separadas;). - mierda

Necesitaba algo similar para SQL SERVER 2000 y, como señala @Mitch, esto solo funciona en 2005+.

Si ayuda a alguien más, esto es lo que funcionó para mí al final:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')

respondido 16 mar '17, 07:03

if exists (
  select * 
  from INFORMATION_SCHEMA.COLUMNS 
  where TABLE_NAME = '<table_name>' 
  and COLUMN_NAME = '<column_name>'
) begin
  print 'Column you have specified exists'
end else begin
  print 'Column does not exist'
end

respondido 07 mar '19, 06:03

IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'TableName'
             AND table_schema = 'SchemaName'
             AND column_name = 'ColumnName')  BEGIN

  ALTER TABLE [SchemaName].[TableName] ADD [ColumnName] int(1) NOT NULL default '0';

END;

Respondido el 17 de Septiembre de 19 a las 02:09

Creo que te refieres a table_schema = 'schema_name'. - tab aleman

Una versión de tabla temporal del respuesta aceptada:

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end

contestado el 23 de mayo de 17 a las 12:05

¿En qué se diferencia eso de la respuesta aceptada? ¿No funcionaría una tabla temporal en la respuesta aceptada? - Juan Saunders

Correcto. La respuesta aceptada no funciona para tablas temporales porque 'sys.columns' debe especificarse como 'tempdb.sys.columns' y el nombre de la tabla debe estar precedido por 'tempdb ..'. - crokusek

select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

Respondido el 06 de diciembre de 13 a las 15:12

La respuesta de Wheat es buena, pero asume que no tiene pares idénticos de nombre de tabla / nombre de columna en ningún esquema o base de datos. Para que sea seguro para esa condición, use esto ...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'

respondido 26 mar '15, 17:03

Hay varias formas de comprobar la existencia de una columna. Recomiendo encarecidamente usar INFORMATION_SCHEMA.COLUMNS tal como se crea para comunicarse con el usuario. Considere las siguientes tablas:

 sys.objects
 sys.columns

e incluso algunos otros métodos de acceso disponibles para comprobar system catalog.

Además, no es necesario usar SELECT *, simplemente pruébelo NULL value

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

Respondido 28 Abr '18, 15:04

No importa incluso si tu SELECT * a EXISTS, porque cuando se usa existe, realmente no selecciona todas las filas y todas las columnas, internamente solo verifica la existencia y no verifica todas las filas y columnas - Pawan Nogariya

Una de las soluciones más simples y comprensibles es:

IF COL_LENGTH('Table_Name','Column_Name') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END

contestado el 24 de mayo de 17 a las 08:05

Aquí hay un script simple que uso para administrar la adición de columnas en la base de datos:

IF NOT EXISTS (
        SELECT *
        FROM sys.Columns
        WHERE Name = N'QbId'
            AND Object_Id = Object_Id(N'Driver')
        )
BEGIN
    ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
    PRINT 'QbId is already added on Driver'
END

En este ejemplo, el Name es la ColumnName para ser agregado y Object_Id es la TableName

Respondido el 28 de enero de 18 a las 04:01

Haga algo si la columna no existe:

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)
    BEGIN
        //Do something
    END
END;

Haga algo si la columna existe:

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)
    BEGIN
        //Do something
    END
END;

respondido 01 nov., 19:11

La siguiente consulta se puede usar para verificar si la columna buscada existe o no en la tabla. Podemos tomar una decisión basada en el resultado de la búsqueda también como se muestra a continuación.

IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
  BEGIN
    SELECT 'Column Already Exists.'
  END
  ELSE
  BEGIN
    ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
  END

Respondido 30 Oct 18, 14:10

Sin embargo, otra variación ...

SELECT 
  Count(*) AS existFlag 
FROM 
  sys.columns 
WHERE 
  [name] = N 'ColumnName' 
  AND [object_id] = OBJECT_ID(N 'TableName')

respondido 07 mar '19, 06:03

Otra contribución es la siguiente muestra que agrega la columna si no existe.

    USE [Northwind]
    GO

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                    WHERE TABLE_NAME = 'Categories'
                        AND COLUMN_NAME = 'Note')
    BEGIN

    ALTER TABLE Categories ADD Note NVARCHAR(800) NULL

    END
    GO

Espero eso ayude. Simone

Respondido 12 Jul 19, 00:07

//Only checks
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database_Name'
and TABLE_SCHEMA = 'Schema_Name'
and TABLE_NAME = 'Table_Name'
and COLUMN_NAME = 'Column_Name'
and DATA_TYPE = 'Column_Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END

Respondido 11 ago 20, 19:08

tabla -> tabla de secuencia de comandos como -> nuevas ventanas: tiene una secuencia de comandos de diseño. comprobar y encontrar el nombre de la columna en nuevas ventanas

contestado el 10 de mayo de 19 a las 16:05

Ejecute la siguiente consulta para verificar si la columna existe en la tabla dada:

IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULL
PRINT 'Column Exists in the given table';

contestado el 29 de mayo de 19 a las 14:05

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database Name'
and TABLE_SCHEMA = 'Schema Name'
and TABLE_NAME = 'Table Name'
and COLUMN_NAME = 'Column Name'
and DATA_TYPE = 'Column Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END

Respondido 08 Jul 19, 11:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.