Как проверить, существует ли столбец в таблице SQL Server? - PullRequest
1723 голосов
/ 25 сентября 2008

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

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

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

Ответы [ 27 ]

24 голосов
/ 03 марта 2011
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
21 голосов
/ 02 августа 2011

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

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END
20 голосов
/ 30 сентября 2011

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

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') 
17 голосов
/ 04 мая 2012

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

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

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
14 голосов
/ 08 мая 2014
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
10 голосов
/ 12 сентября 2013
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;
9 голосов
/ 08 января 2015

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

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
9 голосов
/ 23 мая 2013
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
6 голосов
/ 15 февраля 2016

Есть несколько способов проверить наличие столбца. Я настоятельно рекомендую использовать 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'
         ) 
6 голосов
/ 26 марта 2015

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

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...