首页 文章

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

提问于
浏览
1639

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

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

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

24 回答

  • 38

    您可以使用信息架构系统视图来查找您感兴趣的表的几乎所有内容:

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

    您还可以使用Information_schema视图查询视图,存储过程以及有关数据库的任何内容 .

  • 9

    我更喜欢 INFORMATION_SCHEMA.COLUMNS 而不是系统表,因为Microsoft不保证在版本之间保留系统表 . 例如, dbo.syscolumns 仍然可以在SQL 2008中使用,但它已被弃用,并且可以在将来的任何时候删除 .

  • 1

    这是一个简单的脚本,用于管理数据库中的列添加:

    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
    

    在此示例中, Name 是要添加的 ColumnNameObject_IdTableName

  • 9

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

    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
    
  • 43

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

    if not exists (select
                         column_name
                   from
                         INFORMATION_SCHEMA.columns
                   where
                         table_name = 'MyTable'
                         and column_name = 'MyColumn')
        alter table MyTable add MyColumn int
    

    Edit to deal with edit to question :这应该有用 - 仔细查看代码中的愚蠢错误;你在同一数据库中查询INFORMATION_SCHEMA,例如你的插入被应用?在任何一个语句中,您的表/列名称都有拼写错误吗?

  • 12

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

    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
    
  • 21

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

    select *
    from Information_Schema.Columns
    where Table_Catalog = 'DatabaseName'
      and Table_Schema = 'SchemaName'
      and Table_Name = 'TableName'
      and Column_Name = 'ColumnName'
    
  • 16

    首先检查 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
    
  • 886

    accepted answer的临时表版本:

    if (exists(select 1 
                 from tempdb.sys.columns  
                where Name = 'columnName'
                  and Object_ID = object_id('tempdb..#tableName')))
    begin
    ...
    end
    
  • 1801

    试试这个

    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')
    
  • 125

    有几种方法可以检查列的存在 . 我强烈建议使用 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'
             )
    
  • 4

    尝试以下方法:

    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,但不明白为什么不 .

  • 10

    对于正在检查列存在的人来说 .

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

    ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
    
  • -1

    我需要类似于SQL SERVER 2000,正如@Mitch指出的那样,这只适用于2005年 .

    它应该对其他人有帮助吗,这最终对我有用:

    if exists (
        select * 
        from 
            sysobjects, syscolumns 
        where 
            sysobjects.id = syscolumns.id 
            and sysobjects.name = 'table' 
            and syscolumns.name = 'column')
    
  • 26
    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
    
  • 19

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

    You can see for yourself here

    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
    
  • 4
    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 exists'
      end
    
  • 5

    试试这个...

    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
    
  • 20
    IF NOT EXISTS( SELECT NULL
                FROM INFORMATION_SCHEMA.COLUMNS
               WHERE table_name = 'tablename'
                 AND table_schema = 'db_name'
                 AND column_name = 'columnname')  THEN
    
      ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';
    
    END IF;
    
  • 66

    这在SQL 2000中对我有用:

    IF EXISTS 
    (
        SELECT * 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE table_name = 'table_name' 
        AND column_name = 'column_name'
    )
    BEGIN
    ...
    END
    
  • 28
    select distinct object_name(sc.id)
    from syscolumns sc,sysobjects so  
    where sc.name like '%col_name%' and so.type='U'
    
  • 26

    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
    

    马丁史密斯的版本更短:

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

    更简洁的版本

    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 )始终只返回有关已提交更改的数据,而与生效的隔离级别无关 .

  • 4

    另一种变化......

    SELECT Count(*) AS existFlag FROM sys.columns 
    WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')
    

相关问题