Как проверить, существует ли столбец в таблице SQL Server?

Мне нужно добавить определенный столбец, если он не существует. У меня есть что-то вроде следующего, но оно всегда возвращает false:

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

Как проверить, существует ли столбец в таблице базы данных SQL Server?

Комментарии к вопросу (4)
Решение

SQL сервер 2005 года:

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

Мартин Смит's версия короче:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END
Комментарии (4)

Более лаконичный вариант

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

Пункт про разрешения на просмотр метаданных относится ко всем ответы не только этим.

Обратите внимание, что первым параметром имя таблицы COL_LENGTH может быть в один, два, или три части формата именем, как требуется.

Пример ссылки на таблицу в другой базе данных

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

Одно отличие с этим ответом по сравнению с использованием представления метаданных является то, что функции метаданные, такие как `COL_LENGTH всегда возвращать только данные о совершенных изменений, независимо от уровня изоляции в силу.

Комментарии (15)

Настройте приведенные ниже параметры в соответствии с вашими конкретными требованиями:

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

Правка для обработки правки вопроса: Это должно работать - внимательно просмотрите свой код на предмет глупых ошибок; например, вы запрашиваете INFORMATION_SCHEMA в той же базе данных, в которую применяется вставка? Нет ли у вас опечатки в имени таблицы/столбца в обоих утверждениях?

Комментарии (3)

Попробуйте...

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
Комментарии (4)

Я'д предпочитаете схемы information_schema.Колонн над системной таблицей, потому что Microsoft не гарантирует сохранения системных таблиц между версиями. Например, ДБО.syscolumns по-прежнему работает в SQL 2008, но это'ы устаревшим и может быть удален в любое время в будущем.

Комментарии (3)

Вы можете воспользоваться информационной системой представлений схемы, чтобы узнать почти все о таблицах вы'повторно заинтересованы в:

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

Вы также можете допрашивать представления, хранимые процедуры и почти все о базе данных, используя представления information_schema.

Комментарии (0)

Для людей, которые проверяют наличие столбцов, чтобы удалить его.

От сервер SQL 2016 вы можете использовать новые умирать заявления, а не "если" фантики

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Комментарии (0)

Сначала проверьте, существует ли комбинация table/column(id/name) в dbo.syscolumns (внутренняя таблица SQL Server, содержащая определения полей), и если нет, выполните соответствующий запрос ALTER TABLE, чтобы добавить ее. Например:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Комментарии (0)

Попробуйте что-то вроде:

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

Затем использовать его как это:

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

Он должен работать как сервер SQL 2000 & SQL сервер 2005. Не знаете о SQL Server 2008, но Дон'т вижу, почему нет.

Комментарии (0)

Хороший друг и коллега показывал мне, как вы также можете использовать если блок с функции SQL объект и функция columnproperty в SQL сервер 2005+, чтобы проверить столбец. Вы можете использовать что-то похожее на следующее:

Вы же сами видите здесь

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
Комментарии (1)
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
Комментарии (0)

Попробуйте это

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') 
Комментарии (1)

Это работало для меня в SQL 2000:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END
Комментарии (0)

Мне нужен подобный для SQL Server 2000 и, как @Митч, это работает только инм 2005+.

Это должно помочь кому-то еще, это то, что работал для меня в конце:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
Комментарии (0)
if exists (
  select * 
  from INFORMATION_SCHEMA.COLUMNS 
  where TABLE_NAME = '' 
  and COLUMN_NAME = ''
) begin
  print 'Column you have specified exists'
end else begin
  print 'Column does not exist'
end
Комментарии (0)
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;
Комментарии (1)
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
Комментарии (0)

Временную таблицу версии принято отвечать:

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
Комментарии (2)

Пшеница'ы ответ хороший, но предполагает, что вы не имеют каких-либо идентичных имя таблицы / столбца имя пары в любой схеме или базе данных. Чтобы сделать ее безопасной для этого условия используйте это...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'
Комментарии (0)

Есть несколько способов проверить существование столбца. Я бы настоятельно рекомендуем использовать базы данных information_schema.Колонн как он создан для того, чтобы общаться с пользователем. Рассмотрим следующие таблицы:

 sys.objects
 sys.columns

и даже некоторые другие доступные методы доступа к проверить системный каталог.`

Кроме того, нет необходимости использовать выберите *, просто проверить его на пустое значение

IF EXISTS(
           SELECT NULL 
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE
             TABLE_NAME = 'myTableName'
             AND COLUMN_NAME = 'myColumnName'
         ) 
Комментарии (1)