如何检查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 

马丁史密斯的版本更短:

 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这样的元数据函数总是只返回关于已提交更改的数据,而不pipe隔离级别是否有效。

调整下面以适应您的具体要求:

 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视图来查询视图,存储过程和几乎所有关于数据库的信息。

尝试像这样:

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

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

我的一个好朋友和同事向我展示了如何在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 

对于正在检查列存在的人来说,删除它。

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

 ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name 

尝试这个

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

这在SQL 2000中适用于我:

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

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

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

 if exists ( select * from sysobjects, syscolumns where sysobjects.id = syscolumns.id and sysobjects.name = 'table' and syscolumns.name = 'column') 
 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 
 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; 
 select distinct object_name(sc.id) from syscolumns sc,sysobjects so where sc.name like '%col_name%' and so.type='U' 

接受答案的临时表版本:

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

小麦的答案是好的,但假定在任何模式或数据库中没有任何相同的表名/列名对。 为了使这个条件安全使用这个…

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

最简单和可以理解的解决scheme之一是:

 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 

有几种方法来检查列的存在。 我强烈build议使用INFORMATION_SCHEMA.COLUMNS,因为它是为了与用户交stream而创build的。 考虑下面的表格:

  sys.objects sys.columns 

甚至还有一些其他访问方法可用来检查系统目录。

另外,不需要使用SELECT *,只需通过NULL值进行testing即可

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

我使用简单的脚本来pipe理数据库中列的添加,如下所示:

 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是需要添加的ColumnName,而Object是表名

又一个变化…

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

我正在使用的商业产品使用类似于下面的查询,一次检查是否存在所有必需的列。 查询,特别是列的列表是在软件中创build的。

 SELECT COUNT(Column1+Column2+...+ColumnN) FROM [Tablename] WHERE ID=NULL 

查询通过软件和ODBC连接到数据库,并在try-catchexception处理程序中为我们的C ++程序运行。

如果查询运行正常,则列存在。 如果查询失败,则会执行进一步的查询,并创build缺失的列等等,以便我们的软件始终拥有需要正确运行的表和列。 较旧的数据库被更新以添加它们丢失的列。

这个解决scheme不同于上面的许多解决scheme,因为它是从软件运行的,它可以处理在某些SQL服务器系统表和函数之前的数据库服务器,如INFORMATION_SCHEMA.COLUMNS,sys.columns和object_id(),其中一些特定于供应商而不提供跨Microsoft SQL Server和Adobe MySQL产品等的一般解决scheme

如果您的查询是由您自己的软件和与SQL Server的ODBC连接运行的,而且您希望它们也可以与SQL Server以外的数据库一起运行,那么这种方法可能值得考虑。

这个post已经多次下调了。 我知道它不是大多数人的解决scheme,因为它是用于软件集成的,我知道提供一些与遗留系统兼容的东西,而不是假设和依靠最新的技术是不现代的。 try-catch的想法是丑陋的,使用WHERE ID = NULL来返回单个值,而不pipe实际的表内容是不是直接的。 但是尽pipe得票低于这个数字,我仍然要离开这里,以防万一有人帮忙。

使用这个查询:

  IF EXISTS(SELECT Statement) BEGIN Code END ELSE BEGIN Code END OR IF NOT EXISTS( Select Statement) Begin code End ELSE Begin code End 

这样你可以使用SQL中的条件。

希望它有帮助。

我最好去

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