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

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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'
    +'    ['[email protected]+'] bigint       null')
end

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

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

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')

Ответ 15

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

Ответ 16

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;

Ответ 17

select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

Ответ 18

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

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

Ответ 19

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

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

Ответ 20

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

Ответ 21

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

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

Ответ 22

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

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

Ответ 23

Приведенный ниже запрос может быть использован для проверки наличия или отсутствия в таблице искомого столбца. Мы можем принять решение на основе результатов поиска, как показано ниже.

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

Ответ 24

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

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

Ответ 25

таблица → таблица сценариев как → новые окна - у вас есть сценарий дизайна. проверить и найти имя столбца в новых окнах

Ответ 26

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

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

Ответ 27

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

IF COL_LENGTH('myTableName','myColumnName') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END  

Ответ 28

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

Это должно быть довольно простым способом и прямым решением этой проблемы. Я использовал это несколько раз для подобных сценариев. Это работает как шарм, в этом нет сомнений.

Ответ 29

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END

Ответ 30

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database Name'
and TABLE_SCHEMA = 'Schema Name'
and TABLE_NAME = 'Table Name'
and COLUMN_NAME = 'Column Name'
and DATA_TYPE = 'Column Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END