Pregunta

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?

¿Fue útil?

Solución

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

Otros consejos

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 a 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 devuelven datos sobre cambios confirmados independientemente del nivel de aislamiento vigente.

Modifique lo siguiente para satisfacer 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 lidiar con editar para cuestionar : Eso debería funcionar: revisa cuidadosamente tu código para detectar errores estúpidos. ¿está consultando INFORMATION_SCHEMA en la misma base de datos en la que se está aplicando su inserción, por ejemplo? ¿Tiene un error tipográfico en el nombre de su tabla / columna en cualquiera de las declaraciones?

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

Prefiero INFORMATION_SCHEMA.COLUMNS sobre una tabla del sistema porque Microsoft no garantiza la conservación de 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.

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

Primero compruebe si la combinación tabla / ( id / name ) existe en dbo .syscolumns (una tabla interna de SQL Server que contiene definiciones de campo), y si no es así, emita la consulta apropiada ALTER TABLE para agregarla. Por ejemplo:

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

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

En SQL Server 2016 puede usar nuevas declaraciones DIE en lugar de grandes envoltorios IF

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

Un buen amigo y colega mío me mostró cómo también puedes usar un bloque IF con funciones SQL OBJECT_ID y COLUMNPROPERTY en el SERVIDOR SQL 2005+ para comprobar 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
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

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

Prueba esto

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') 

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

En caso de que ayude 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')
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
IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'tablename'
             AND table_schema = 'db_name'
             AND column_name = 'columnname')  THEN

  ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';

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

Una versión de tabla temporal de la respuesta aceptada :

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

La respuesta de Wheat es buena, pero asume que no tiene pares de nombre de tabla / nombre de columna idénticos en ningún esquema o base de datos. Para hacerlo 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'

Hay varias formas de verificar la existencia de una columna. Recomiendo encarecidamente utilizar INFORMATION_SCHEMA.COLUMNS , ya que está creado para comunicarse con el usuario. Considere las siguientes tablas:

 sys.objects
 sys.columns

e incluso algunos otros métodos de acceso disponibles para consultar el catálogo del sistema.

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

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

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

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 Nombre es el ColumnName que se agregará y Object_Id es el TableName

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 buscado 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

Otra variación ...

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

table - > script table como - > new windows - tiene un script de diseño. compruebe y encuentre el nombre de la columna en nuevas ventanas

Ejecute la consulta a continuación 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';
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))
  

Esta debería ser la forma más sencilla y la solución directa para este problema. He usado esto varias veces para escenarios similares. Funciona a la perfección, sin dudas.

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')

BEGIN
--COLUMNS EXISTS IN TABLE
END

ELSE BEGIN
--COLUMNS DOES NOT EXISTS IN TABLE
END
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top