Как проверить, существует ли столбец в таблице 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 ]

1900 голосов
/ 25 сентября 2008

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
923 голосов
/ 20 марта 2011

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

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

131 голосов
/ 25 сентября 2008

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

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

68 голосов
/ 25 сентября 2008

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

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
44 голосов
/ 26 июня 2009

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

40 голосов
/ 25 сентября 2008

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

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

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

31 голосов
/ 25 сентября 2008

Сначала проверьте, существует ли комбинация 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
29 голосов
/ 01 мая 2016

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

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
29 голосов
/ 25 сентября 2008

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

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, но не вижу почему.

24 голосов
/ 21 марта 2013

Мой хороший друг и коллега показал мне, как можно также использовать блок 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...