2038

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

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

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

4

32 回答 32

2245

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
于 2008-09-25T12:39:21.297 回答
1082

更简洁的版本

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始终只返回有关已提交更改的数据,而不管有效的隔离级别如何)。

于 2011-03-20T14:47:50.917 回答
165

调整以下内容以满足您的特定要求:

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?在任一语句中,您的表/列名称是否有错字?

于 2008-09-25T12:35:54.987 回答
83

试试这个...

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
于 2008-09-25T12:35:28.920 回答
64

对于在删除列之前检查列存在的人。

SQL Server 2016 开始,您可以使用新的 DIE 语句而不是大IF包装器

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
于 2016-05-01T04:46:00.187 回答
49

我更喜欢INFORMATION_SCHEMA.COLUMNS系统表,因为 Microsoft 不保证在版本之间保留系统表。例如,dbo.syscolumns它在 SQL 2008 中仍然有效,但它已被弃用,将来可能随时被删除。

于 2009-06-26T08:58:19.733 回答
43

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

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

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

于 2008-09-25T12:38:35.777 回答
36

尝试类似:

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,但不明白为什么不这样做。

于 2008-09-25T12:38:39.487 回答
34

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

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
于 2008-09-25T12:37:59.270 回答
28

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

你可以自己看看这里

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
于 2013-03-20T22:27:38.757 回答
27
declare @myColumn   as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
    select  1
    from    information_schema.columns columns 
    where   columns.table_catalog   = 'myDatabase'
        and columns.table_schema    = 'mySchema' 
        and columns.table_name      = 'myTable' 
        and columns.column_name     = @myColumn
    )
begin
    exec('alter table myDatabase.mySchema.myTable add'
    +'    ['+@myColumn+'] bigint       null')
end
于 2011-03-03T15:49:31.893 回答
25

这在 SQL 2000 中对我有用:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END
于 2011-08-02T19:54:19.907 回答
22

试试这个

SELECT COLUMNS.*
FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,
       INFORMATION_SCHEMA.TABLES TABLES
WHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
       AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name') 
于 2011-09-30T13:08:56.320 回答
19

我需要类似的 SQL SERVER 2000,正如@Mitch 指出的那样,这仅适用于 2005+。

如果它可以帮助其他人,这最终对我有用:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
于 2012-05-04T14:14:59.630 回答
15
IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'TableName'
             AND table_schema = 'SchemaName'
             AND column_name = 'ColumnName')  BEGIN

  ALTER TABLE [SchemaName].[TableName] ADD [ColumnName] int(1) NOT NULL default '0';

END;
于 2013-09-12T12:30:20.953 回答
15
if exists (
  select * 
  from INFORMATION_SCHEMA.COLUMNS 
  where TABLE_NAME = '<table_name>' 
  and COLUMN_NAME = '<column_name>'
) begin
  print 'Column you have specified exists'
end else begin
  print 'Column does not exist'
end
于 2014-05-08T07:15:45.407 回答
11

已接受答案的临时表版本:

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
于 2015-01-07T23:56:25.060 回答
10
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
于 2013-05-23T10:25:43.887 回答
9

如果列不存在,请执行以下操作:

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)
    BEGIN
        //Do something
    END
END;

如果列存在,请执行以下操作:

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)
    BEGIN
        //Do something
    END
END;
于 2019-11-01T11:53:11.197 回答
8

Wheat 的回答很好,但假设您在任何架构或数据库中都没有任何相同的表名/列名对。为了使其在这种情况下安全,请使用此...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'
于 2015-03-26T17:42:36.757 回答
8

有几种方法可以检查列的存在。我强烈建议使用INFORMATION_SCHEMA.COLUMNS它是为了与用户交流而创建的。考虑下表:

 sys.objects
 sys.columns

甚至还有其他一些可用于检查的访问方法system catalog.

另外,无需使用SELECT *,只需通过以下方式进行测试NULL value

IF EXISTS(
           SELECT NULL 
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE
             TABLE_NAME = 'myTableName'
             AND COLUMN_NAME = 'myColumnName'
         ) 
于 2016-02-15T20:45:22.163 回答
8

最简单易懂的解决方案之一是:

IF COL_LENGTH('Table_Name','Column_Name') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END
于 2017-05-24T07:17:40.077 回答
7

这是我用来管理在数据库中添加列的简单脚本:

IF NOT EXISTS (
        SELECT *
        FROM sys.Columns
        WHERE Name = N'QbId'
            AND Object_Id = Object_Id(N'Driver')
        )
BEGIN
    ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
    PRINT 'QbId is already added on Driver'
END

在此示例中,NameColumnName要添加的,Object_IdTableName

于 2016-11-16T12:21:08.690 回答
4

下面的查询可用于检查表中是否存在搜索列。我们也可以根据搜索结果做出决定,如下所示。

IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
  BEGIN
    SELECT 'Column Already Exists.'
  END
  ELSE
  BEGIN
    ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
  END
于 2018-10-30T14:31:52.030 回答
4

另一个贡献是以下示例,如果不存在则添加列。

    USE [Northwind]
    GO

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                    WHERE TABLE_NAME = 'Categories'
                        AND COLUMN_NAME = 'Note')
    BEGIN

    ALTER TABLE Categories ADD Note NVARCHAR(800) NULL

    END
    GO

希望能帮助到你。西蒙妮

于 2019-07-11T23:18:02.283 回答
4
//Only checks
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database_Name'
and TABLE_SCHEMA = 'Schema_Name'
and TABLE_NAME = 'Table_Name'
and COLUMN_NAME = 'Column_Name'
and DATA_TYPE = 'Column_Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END
于 2020-08-11T18:51:33.673 回答
3

还有一个变种...

SELECT 
  Count(*) AS existFlag 
FROM 
  sys.columns 
WHERE 
  [name] = N 'ColumnName' 
  AND [object_id] = OBJECT_ID(N 'TableName')
于 2014-07-10T11:01:43.773 回答
1

table -->script table as -->new windows - 你有设计脚本。在新窗口中检查并查找列名

于 2019-05-10T15:56:44.450 回答
1

执行以下查询以检查给定表中是否存在该列:

IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULL
PRINT 'Column Exists in the given table';
于 2019-05-29T13:43:52.593 回答
1
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database Name'
and TABLE_SCHEMA = 'Schema Name'
and TABLE_NAME = 'Table Name'
and COLUMN_NAME = 'Column Name'
and DATA_TYPE = 'Column Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END
于 2019-07-08T10:58:47.380 回答
1

您可以一次检查 SQLDB 中的多个列并返回一个字符串作为状态以检查列是否存在

IF EXISTS 
        (
          SELECT *
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = 'Table Name'
          AND(COLUMN_NAME = 'column 1'
          or COLUMN_NAME = 'column 2'
          or COLUMN_NAME = 'column 3'
          or COLUMN_NAME = 'column 4')
        )
        SELECT 'Column exists in table' AS[Status];
        ELSE
        SELECT 'Column does not exist in table' AS[Status];
于 2021-11-02T08:21:59.243 回答
0
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))

这应该是解决这个问题的相当简单的方法和直接的解决方案。对于类似的场景,我已经多次使用它。它就像一个魅力,毫无疑问。

于 2019-04-03T09:45:20.677 回答