当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何检查SQLServer表中是否存在列?》经验,为你挑选了22个好方法。

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

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

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



1> Mitch Wheat..:

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



2> Martin Smith..:

更简洁的版本

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


@MartinSmith我敢肯定他的意思不太可读,因为如果你不知道这个成语,并且你从别人那里继承了这个代码,你就不会立即理解代码的作用.有点像在C++中编写`x >> 2`而不是`x/4`.更冗长的代码(如果存在(从information_schema中选择column_name))需要更多的空间,但没有人会试图弄清楚它的作用.
@Bill - 以什么方式可读性差?在Firefox中看起来很好.这个答案比公认的答案晚2年以上发布,这解释了IMO的评级.如果你不太清楚它是否存在检查这种类型的习惯用法在SQL Server中很常见.例如,使用`IF OBJECT_ID('TableName','U')IS NULL`来检查对象存在,或者`DB_ID('foo')`来检查数据库是否存在.
除了更简洁,这是一种更快的解决方案.访问`INFORMATION_SCHEMA`视图或`sys.columns`命中磁盘,而`COL_LENGTH`使用缓存的数据库元数据.
这比其他一些答案的可读性差,可能是为什么它的评价不高.
这可能不是最受好评的答案,因为它是在另一个之后的2.5年.这就是为什么我总是在比较两个答案的评分时查看日期.克服早先给出的答案需要更长的时间.;)
"_Less readable_"问题解决方案:`IF COL_LENGTH('Incidente_Incidente','Id_NC_I')IS NULL/*<---此行检查SQL Server表中是否存在列*/`;)
选择解决方案需要对架构方案进行额外的列检查.col_length可以用`col_length('schema.table','column')`.
@PasSavolainen,它也接受三部分命名.`db_name.schema_name.table_name`.我将编辑我的答案,明确地将其作为三个upvotes [在此评论](http://stackoverflow.com/questions/133031/how-to-check-if-column-exists-in-sql-server-表#comment24720735_133031)表明不是每个人都意识到......

3> Luke Bennett..:

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

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


-1:没有回答OP的问题,只是添加了关于如何添加新匹配的新信息,尽管OP根本没有询问,但没有解决OP的评论.
我刚刚发现在where子句修复问题后添加TABLE_SCHEMA ='mySchema'.

4> Leon Tayson..:

试试这个...

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


您可以使用`SELECT 1`而不是`SELECT TOP 1 1`;).
此方法也适用于SQL CE,而提到的其他一些方法则不适用.
在`EXISTS`语句中,SQL会自动优化列(非常像`count(*)`),因此`SELECT*`就足够了.

5> Christian Ha..:

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


["INFORMATION_SCHEMA视图可能不完整,因为它们未针对所有新功能进行更新"](http://msdn.microsoft.com/en-us/library/ms186224.aspx)
是的,不用多说,因为`INFORMATION_SCHEMA`视图只包含ANSI标准元数据.但是,这对于存在测试来说已经足够了.
Microsoft说:“在SQL Server的未来版本中,Microsoft可能会通过在列列表的末尾添加列来扩大任何系统目录视图的定义。我们建议不要在生产代码中使用语法SELECT * FROM sys.catalog_view_name,因为返回的列可能会更改并破坏您的应用程序。” 这意味着他们不会删除列或更改其顺序。对于几乎所有情况,向后兼容性都足够好。

6> 小智..:

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

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

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



7> Pரதீப்..:

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

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name



8> mdb..:

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



9> Matt Lacey..:

尝试类似的东西:

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> brazilianlds..:

我的一位好朋友和同事向我展示了如何使用IFSQL函数块OBJECT_IDCOLUMNPROPERTYSQL 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



11> 小智..:
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



12> Joe M..:

这在SQL 2000中对我有用:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END



13> 小智..:

试试这个

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



14> FrostbiteXII..:

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

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

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')



15> 小智..:
if exists (
  select * 
  from INFORMATION_SCHEMA.COLUMNS 
  where TABLE_NAME = '' 
  and COLUMN_NAME = ''
) begin
  print 'Column you have specified exists'
end else begin
  print 'Column does not exist'
end



16> Na30m..:
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;


我认为您的意思是table_schema ='schema_name'。

17> Nishad..:
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'



18> crokusek..:

接受答案的临时表版本:

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



19> Daniel Barba..:

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

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



20> 小智..:

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



21> 小智..:

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

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



22> Arsman Ahmad..:

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

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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有