Pergunta

Eu preciso adicionar uma coluna específica se ele não existe. Eu tenho algo como o seguinte, mas sempre retorna false:

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

Como posso verificar se uma coluna existe em uma tabela do banco de dados SQL Server?

Foi útil?

Solução

SQL Server 2005 em diante:

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

A versão de Martin Smith é mais curto:

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

Outras dicas

A versão mais 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

O ponto sobre permissões em metadados visualização aplica-se a todas as respostas não apenas este.

Note que o primeiro parâmetro nome da tabela para COL_LENGTH pode estar em um, dois, ou três formato de nome da peça, conforme necessário.

Um exemplo fazendo referência a uma tabela em um banco de dados diferente é

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

Uma diferença com esta resposta em relação ao uso dos pontos de vista de metadados é que as funções de metadados, como COL_LENGTH sempre retornar apenas dados sobre alterações confirmadas independentemente do nível de isolamento em vigor.

Tweak a seguir para atender às suas necessidades específicas:

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 lidar com edição em questão : Isso deve funcionar - ter um olhar atento sobre o seu código para erros estúpidos; você está consultando INFORMATION_SCHEMA no mesmo banco de dados como a sua inserção está sendo aplicada, por exemplo? Você tem um erro de digitação em seu nome de tabela / coluna em qualquer declaração?

Tente isto ...

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

Eu prefiro INFORMATION_SCHEMA.COLUMNS sobre uma tabela de sistema porque a Microsoft não garante a preservar as tabelas do sistema entre as versões. Por exemplo, dbo.syscolumns ainda funciona no SQL 2008, mas está obsoleto e pode ser removido a qualquer momento no futuro.

Você pode usar as exibições do sistema esquema de informações para descobrir praticamente qualquer coisa sobre as tabelas que você está interessado em:

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

Você pode vistas também interrogar, procedimentos e praticamente nada sobre o banco de dados usando as vistas INFORMATION_SCHEMA armazenado.

Primeiro, verifique se a combinação table / column (id / name) existe em dbo.syscolumns (uma tabela do SQL Server interna que contém definições de campo), e se não emitir a consulta ALTER TABLE apropriado para adicioná-lo. Por exemplo:

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

Para as pessoas que está verificando a existência da coluna para soltá-lo.

Em SQL Server 2016 você pode usar novas declarações DIE em vez de grandes invólucros IF

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Tente 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

Em seguida, usá-lo como este:

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

Ele deve funcionar no SQL Server 2000 e SQL Server 2005. Não tenho certeza sobre o SQL Server 2008, mas não vejo por que não.

Um bom amigo e colega meu me mostrou como você também pode usar um bloco IF com SQL funções OBJECT_ID e COLUMNPROPERTY no SQL Server 2005 + para verificar se há uma coluna. Você pode usar algo semelhante ao seguinte:

Você pode ver por si mesmo aqui

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

Isso funcionou para mim no SQL 2000:

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

Tente este

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

Eu precisava semelhante para SQL Server 2000 e, como @ Mitch aponta, isso só funciona INM 2005 +.

Deve ajuda ninguém, isso é o que funcionou para mim no 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'

A versão tabela temporária do aceita resposta :

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

A resposta de trigo é bom, mas assume que você não tem nenhum pares nome de nome de tabela / coluna idênticos em qualquer esquema ou banco de dados. Para torná-la segura para essa condição utilizar este ...

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

Existem várias maneiras de verificar a existência de uma coluna. Eu fortemente recomendo usar INFORMATION_SCHEMA.COLUMNS como ele é criado, a fim de se comunicar com o usuário. Considere seguintes tabelas:

 sys.objects
 sys.columns

e até mesmo alguns outros métodos de acesso disponíveis para verificar system catalog.

Além disso, não há necessidade de uso SELECT *, simplesmente testá-lo por NULL value

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

Um dos mais simples e compreensível solução é:

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

Aqui está um script simples que eu uso para gerenciar adição de colunas no banco de dados:

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

Neste exemplo, o Name é o ColumnName para ser adicionado e Object_Id é o TableName

Abaixo consulta pode ser usado para verificar se procurou coluna existe ou não na tabela. Podemos tomar decisão com base na procurou resultado também como mostrado abaixo.

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

Ainda outra variação ...

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

tabela -> tabela de script como -> novas janelas - você tem roteiro design. verificar e encontrar o nome de coluna em novas janelas

Execute o abaixo consulta para verificar se a coluna existe na tabela 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 deve ser a maneira bastante fácil e solução para a frente a este problema. Eu tenho usado isso várias vezes para cenários semelhantes. Ele funciona como um encanto, há dúvidas sobre isso.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top