将列添加到表(如果尚不存在)


188

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

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

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

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



您应该使用sys.tables“ generic”而不是sys.objects- 而不是显式地指定类型(从sys.tables已经是显而易见的类型了。)
marc_s 2012年

COL_LENGTH Alternative仅在SQL-Server 2008中有效,但是有效。
Paul-Henri

Answers:


218

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

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

42
请注意,在这种情况下,您想在实际代码中使用IF NOT EXISTS。
2013年

2
对于优化的查询,您可以将top 1与select语句一起使用
Banketeshvar Narayan 2014年

11
@BanketeshvarNarayan,这是不正确的。EXISTS子句中子查询的执行计划是相同的。类似SELECT 1SELECT TOP 1不必要的事情。该EXISTS条款本身告诉查询优化器仅执行最低读取必要评估EXISTS......至少在SQL Server中。其他数据库引擎可能具有或多或少有效的查询优化器。
肯尼斯·科克伦

9
@BanketeshvarNarayan如果您正在优化ADD Column查询……您必须经常运行它们!
Fenton

1
@ user391339-我已经发布了与OP发布类似的构造,但是是的,如果您想在该列存在时采取措施,则该语句将为IF NOT EXISTS。我真的没有必要为此编辑答案,但是如果您认为自己有所改进,请随时进行自我编辑。
Lieven Keersmaekers,

91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END

1
我尝试执行此操作,但是它返回错误,指出COL_LENGTH函数不存在。
ThEpRoGrAmMiNgNoOb,2015年

3
需要SQL Server 2008+
Robert Brown

6
小添加-列名中不应使用方括号,因为COL_LENGTH('table_name', '[column_name]')在SQL Server 2016(COL_LENGTH('[table_name]', 'column_name') works as expected)中始终返回null 。
stop-cran

33

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

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

2
我喜欢。我认为关于在此处发布内容的最好部分是找到这样的宝石。
JStead 2012年

2
什么是“ ColumnId”?
MariusStănescu19年

“ ColumnId”是您要检查的列属性的名称。你可以就可能使用存在于一列,如姓名等任何属性名称
雅克·博世

5

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

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

当检查另一个数据库中的列时,您可以简单地包括数据库名称:

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)

-1
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.