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

时间:2020-03-06 14:43:03  来源:igfitidea点击:

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

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

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

解决方案

试试这个...

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

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

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

首先检查dbo.syscolumns(包含字段定义的内部SQL Server表)中是否存在table / column(id / 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

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

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

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

尝试类似的东西:

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开始:

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

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