如何检查 SQL Server 表中是否存在列?

如果它不存在,我需要添加一个特定的列。我有类似以下内容,但始终返回 false:

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

如何检查 SQL Server 数据库表中是否存在列?

答案

从 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

Martin Smith 的版本较短:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

更简洁的版本

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元数据功能始终仅返回有关已提交更改的数据。

调整以下内容以适合您的特定要求:

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?您的表 / 列名称中是否有错字?

尝试这个...

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

我更喜欢INFORMATION_SCHEMA.COLUMNS而不是系统表,因为 Microsoft 不保证在版本之间保留系统表。例如, dbo.syscolumns在 SQL 2008 中仍然可以使用,但已过时,以后可以随时删除。

您可以使用信息模式系统视图来查找有关您感兴趣的表的几乎所有信息:

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

您还可以使用 Information_schema 视图查询视图,存储过程以及有关数据库的几乎所有内容。

对于正在检查该列存在的人员来说,将其删除。

SQL Server 2016 中,您可以使用新的 DIE 语句代替大型IF包装器

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

首先检查dbo.syscolumns (包含字段定义的内部 SQL Server 表)中是否存在table / columnid / name )组合,如果不存在,则发出适当的ALTER TABLE查询来添加它。例如:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

尝试类似:

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,但看不到为什么。

我的一个好朋友和一位同事向我展示了如何在 SQL SERVER 2005 + 中还可以使用带有 SQL 函数OBJECT_IDCOLUMNPROPERTYIF块来检查列。您可以使用类似于以下内容的东西:

你可以在这里自己看

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