关于sql server:向表中添加一个列(如果它尚不存在)

Add a column to a table, if it does not already exist

我想为MS SQL Server编写一个查询,将列添加到表中。但我不希望在运行/执行以下查询时显示任何错误。

我正在使用这种查询添加表…

1
2
3
4
5
6
IF EXISTS (
       SELECT *
       FROM   sys.objects
       WHERE  OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
              AND TYPE IN (N'U')
   )

但是我不知道如何为列编写这个查询。


通过使用sys.columns表io sys.objects可以使用类似的构造。

1
2
3
4
5
6
IF NOT EXISTS (
  SELECT *
  FROM   sys.columns
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]')
         AND name = 'ColumnName'
)


1
2
3
4
5
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END


另一种选择。我更喜欢这种方法,因为它写得更少,但两种方法完成了相同的事情。

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

我还注意到你的表在寻找表的位置,显然就是这个

1
 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null


这是另一个对我有用的变体。

1
2
3
4
5
6
7
8
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

EDIT:
Note that INFORMATION_SCHEMA views may not always be updated, use SYS.COLUMNS instead:

埃多克斯1〔2〕


1
2
3
4
5
IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO

我希望这会有所帮助。更多信息


1
2
3
4
5
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