Добавить столбец в таблицу, если он еще не существует - PullRequest
151 голосов
/ 15 января 2012

Я хочу написать запрос для MS SQL Server, который добавляет столбец в таблицу. Но я не хочу отображать ошибки, когда запускаю / выполняю следующий запрос.

Я использую этот вид запроса для добавления таблицы ...

IF EXISTS (
       SELECT *
       FROM   sys.objects
       WHERE  OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
              AND TYPE IN (N'U')
   )

Но я не знаю, как написать этот запрос для столбца.

Ответы [ 6 ]

181 голосов
/ 15 января 2012

Вы можете использовать аналогичную конструкцию, используя таблицу sys.columns io sys.objects.

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)
67 голосов
/ 21 июня 2013
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END
31 голосов
/ 15 января 2012

Еще одна альтернатива.Я предпочитаю этот подход, потому что он меньше пишет, но оба выполняют одно и то же.

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL
BEGIN
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL
END

Я также заметил, что вы ищете, где действительно существует таблица, которая, очевидно, является именно такой

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null
1 голос
/ 03 октября 2018

Вот еще один вариант, который работал для меня.

IF NOT EXISTS (SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE upper(TABLE_NAME) = 'TABLENAME'
        AND upper(COLUMN_NAME) = 'COLUMNNAME')
BEGIN
    ALTER TABLE [dbo].[Person] ADD Column
END
GO

РЕДАКТИРОВАТЬ: обратите внимание, что INFORMATION_SCHEMA представления могут не всегда обновляться, вместо этого используйте SYS.COLUMNS:

IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....

0 голосов
/ 02 мая 2019
IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO

Надеюсь, это поможет. Подробнее

0 голосов
/ 01 декабря 2016
IF NOT EXISTS (SELECT 1  FROM SYS.COLUMNS WHERE  
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth')
BEGIN
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME
END
...