如果表尚不存在,请向表中添加一列

Tav*_*usi 169 sql-server add not-exists

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

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

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

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

Lie*_*ers 199

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

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

  • 请注意,在这种情况下,您希望在实际代码中使用IF NOT EXISTS. (42认同)
  • @BanketeshvarNarayan这是不正确的."EXISTS"子句中子查询的执行计划是相同的."SELECT 1"或"SELECT TOP 1"之类的东西是不必要的.`EXISTS`子句本身告诉查询优化器只执行评估`EXISTS`所需的最小读取...至少在SQL Server中.其他数据库引擎可能具有或多或少有效的查询优化器. (8认同)
  • @BanketeshvarNarayan如果你正在优化你的`ADD Column`查询......你必须经常运行它们! (5认同)
  • 对于优化查询,您可以使用top语句和select语句 (2认同)
  • @Kush - 将“AND = 'ColumnName'”替换为“AND name in ('ColumnName1', 'ColumnName2')” (2认同)

小智 78

IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END
Run Code Online (Sandbox Code Playgroud)

  • 小的添加 - 一个不应该在列名中使用方括号,因为`COL_LENGTH('table_name','[column_name]')`总是在SQL Server 2016中返回null(`COL_LENGTH('[table_name]','column_name' )按预期工作`). (4认同)
  • 需要SQL Server 2008+ (2认同)

JSt*_*ead 31

另一种选择.我更喜欢这种方法,因为写作较少,但两者完成同样的事情.

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

我也注意到你的是在寻找表存在的地方,显然就是这个

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null
Run Code Online (Sandbox Code Playgroud)

  • 什么是“ColumnId”? (5认同)
  • 我喜欢.我认为在这里发布的最好的部分是找到这样的宝石. (2认同)

Sha*_*Dev 6

IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO
Run Code Online (Sandbox Code Playgroud)

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

  • 这在 SqlServer 2000 上对我有用,而接受的答案却没有。sys.* 视图似乎已在 SqlServer 2005 周围的某个位置添加,参见。https://learn.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/system-compatibility-views-transact-sql (2认同)

Adi*_*aza 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
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,INFORMATION_SCHEMA视图可能并不总是更新,SYS.COLUMNS而是使用:

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

  • 如果您要编辑,只需编辑它以使用 SYS.COLUMNS,而不是说明更改查询的注释! (2认同)