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

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

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

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

вопрос задан 25.09.2008
Maciej
8324 репутация

23 ответов


  • 1757 рейтинг

    SQL Server 2005 и выше:

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

    Версия Мартина Смита короче:

    IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
    BEGIN
        -- Column Exists
    END
    
    ответ дан Mitch Wheat, с репутацией 248826, 25.09.2008
  • 865 рейтинг

    Более краткая версия

     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, всегда возвращают данные только о зафиксированных изменениях, независимо от действующего уровня изоляции.

    ответ дан Martin Smith, с репутацией 333672, 20.03.2011
  • 125 рейтинг

    Настройте ниже, чтобы удовлетворить ваши конкретные требования:

    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 в той же базе данных, к которой применяется ваша вставка, например? У вас есть опечатка в названии таблицы / столбца в любом утверждении?

    ответ дан Luke Bennett, с репутацией 27569, 25.09.2008
  • 65 рейтинг

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

    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
    
    ответ дан Leon Tayson, с репутацией 3222, 25.09.2008
  • 43 рейтинг

    Я бы предпочел INFORMATION_SCHEMA.COLUMNS системной таблице, потому что Microsoft не гарантирует сохранение системных таблиц между версиями. Например, dbo.syscolumns по-прежнему работает в SQL 2008, но он устарел и может быть удален в любое время в будущем.

    ответ дан Christian Hayter, с репутацией 26127, 26.06.2009
  • 38 рейтинг

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

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

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

    ответ дан mdb, с репутацией 42242, 25.09.2008
  • 28 рейтинг

    Сначала проверьте, существует ли комбинация 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
    
    ответ дан mdb, с репутацией 42242, 25.09.2008
  • 26 рейтинг

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

    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 Server 2000, так и на SQL Server 2005. Не уверен насчет SQL Server 2008, но не понимаю, почему нет.

    ответ дан Matt Lacey, с репутацией 59568, 25.09.2008
  • 25 рейтинг

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

    В SQL Server 2016 вы можете использовать новые операторы DIE вместо больших IF оболочек

    ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
    
    ответ дан Pரதீப், с репутацией 74063, 1.05.2016
  • 22 рейтинг
    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
    
    ответ дан Tuomo Kämäräinen, с репутацией 221, 3.03.2011
  • 21 рейтинг

    Мой хороший друг и коллега показал мне, как можно также использовать блок IF с функциями SQL OBJECT_ID и COLUMNPROPERTY в SQL SERVER 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
    
    ответ дан brazilianldsjaguar, с репутацией 1086, 20.03.2013
  • 20 рейтинг

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

    IF EXISTS 
    (
        SELECT * 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE table_name = 'table_name' 
        AND column_name = 'column_name'
    )
    BEGIN
    ...
    END
    
    ответ дан Joe M, с репутацией 979, 2.08.2011
  • 19 рейтинг

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

    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') 
    
    ответ дан Douglas Tondo, с репутацией 191, 30.09.2011
  • 16 рейтинг

    Мне нужно было подобное для SQL SERVER 2000, и, как указывает @Mitch, это работает только в 2005+.

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

    if exists (
        select * 
        from 
            sysobjects, syscolumns 
        where 
            sysobjects.id = syscolumns.id 
            and sysobjects.name = 'table' 
            and syscolumns.name = 'column')
    
    ответ дан FrostbiteXIII, с репутацией 673, 4.05.2012
  • 12 рейтинг
    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 exists'
      end
    
    ответ дан BYRAKUR SURESH BABU, с репутацией 121, 8.05.2014
  • 10 рейтинг
    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;
    
    ответ дан Na30m, с репутацией 126, 12.09.2013
  • 9 рейтинг

    Временная табличная версия принятого ответа :

    if (exists(select 1 
                 from tempdb.sys.columns  
                where Name = 'columnName'
                  and Object_ID = object_id('tempdb..#tableName')))
    begin
    ...
    end
    
    ответ дан crokusek, с репутацией 2859, 7.01.2015
  • 9 рейтинг
    select distinct object_name(sc.id)
    from syscolumns sc,sysobjects so  
    where sc.name like '%col_name%' and so.type='U'
    
    ответ дан Nishad, с репутацией 307, 23.05.2013
  • 5 рейтинг

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

    select *
    from Information_Schema.Columns
    where Table_Catalog = 'DatabaseName'
      and Table_Schema = 'SchemaName'
      and Table_Name = 'TableName'
      and Column_Name = 'ColumnName'
    
    ответ дан Daniel Barbalace, с репутацией 621, 26.03.2015
  • 4 рейтинг

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

    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
    

    В этом примере Name - это ColumnName, который нужно добавить, а Object_Id - это TableName

    .
    ответ дан UJS, с репутацией 533, 16.11.2016
  • 4 рейтинг

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

     sys.objects
     sys.columns
    

    и даже некоторые другие методы доступа доступны для проверки system catalog.

    Кроме того, нет необходимости использовать SELECT *, просто протестируйте его по NULL value

    IF EXISTS(
               SELECT NULL 
               FROM INFORMATION_SCHEMA.COLUMNS
               WHERE
                 TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName'
             ) 
    
    ответ дан Ali Elmi, с репутацией 181, 15.02.2016
  • 4 рейтинг

    Одним из самых простых и понятных решений является:

    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
    
    ответ дан Arsman Ahmad, с репутацией 597, 24.05.2017
  • -1 рейтинг

    Еще один вариант. , ,

    SELECT Count(*) AS existFlag FROM sys.columns 
    WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')
    
    ответ дан Manuel Alves, с репутацией 1488, 10.07.2014