如何检查SQLServer表中是否存在列

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

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

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

1513032 次浏览

试试这个…

IF NOT EXISTS(SELECT TOP 1 1FROM INFORMATION_SCHEMA.COLUMNSWHERE[TABLE_NAME] = 'Employees'AND [COLUMN_NAME] = 'EmployeeID')BEGINALTER TABLE [Employees]ADD [EmployeeID] INT NULLEND

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

if not exists (selectcolumn_namefromINFORMATION_SCHEMA.columnswheretable_name = 'MyTable'and column_name = 'MyColumn')alter table MyTable add MyColumn int

这应该可以-仔细检查您的代码是否存在愚蠢的错误;例如,您是否在应用插入的同一数据库上查询INFORMATION_SCHEMA?您的表/列名中是否有错字?

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

IF NOT EXISTS ( SELECT  *FROM    syscolumnsWHERE   id = OBJECT_ID('Client')AND name = 'Name' )ALTER TABLE ClientADD Name VARCHAR(64) NULL

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

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

您还可以使用Information_schema视图查询视图、存储过程和几乎任何有关数据库的信息。

尝试类似的东西:

CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))RETURNS varchar(1) ASBEGINDECLARE @Result varchar(1);IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)BEGINSET @Result = 'T'ENDELSEBEGINSET @Result = 'F'ENDRETURN @Result;ENDGO
GRANT EXECUTE ON  [ColumnExists] TO [whoever]GO

然后像这样使用它:

IF ColumnExists('xxx', 'yyyy') = 'F'BEGINALTER TABLE xxxADD yyyyy varChar(10) NOT NULLENDGO

它应该对SQLServer 2000SQLServer 2005都有效。我不确定SQLServer 2008,但我不明白为什么不。

SQLServer 2005:

IF EXISTS(SELECT 1 FROM sys.columnsWHERE Name = N'columnName'AND Object_ID = Object_ID(N'schemaName.tableName'))BEGIN-- Column ExistsEND

马丁·史密斯的版本更短:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULLBEGIN-- Column ExistsEND

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

declare @myColumn   as nvarchar(128)set @myColumn = 'myColumn'if not exists (select  1from    information_schema.columns columnswhere   columns.table_catalog   = 'myDatabase'and columns.table_schema    = 'mySchema'and columns.table_name      = 'myTable'and columns.column_name     = @myColumn)beginexec('alter table myDatabase.mySchema.myTable add'+'    ['+@myColumn+'] bigint       null')end

更简洁的版本

IF COL_LENGTH('table_name','column_name') IS NULLBEGIN/* Column does not exist or caller does not have permission to view the object */END

关于查看元数据权限的观点适用于所有答案,而不仅仅是这个。

请注意,#0的第一个参数表名可以根据需要采用一个、两个或三个部分的名称格式。

引用不同数据库中的表的示例是:

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

与使用元数据视图相比,此答案的一个区别是元数据函数(例如COL_LENGTH)始终仅返回有关已提交更改的数据,而与有效的隔离级别无关。

在SQLServer 2000中:

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

试试这个

SELECT COLUMNS.*FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,INFORMATION_SCHEMA.TABLES TABLESWHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAMEAND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name')

我需要类似的SQLServer 2000,作为米奇指出,这只适用于SQLServer 2005或更高版本。

这就是我最后的工作:

if exists (select *fromsysobjects, syscolumnswheresysobjects.id = syscolumns.idand sysobjects.name = 'table'and syscolumns.name = 'column')

我的一个好朋友和同事向我展示了如何在SQLServer 2005和更高版本中使用带有SQL函数OBJECT_IDCOLUMNPROPERTYIF块来检查列。您可以使用类似于以下内容的东西:

你可以在这里亲眼看看

IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL ANDCOLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)BEGINSELECT 'Column does not exist -- You can add TSQL to add the column here'END
select distinct object_name(sc.id)from syscolumns sc,sysobjects sowhere sc.name like '%col_name%' and so.type='U'
IF NOT EXISTS(SELECT NULLFROM  INFORMATION_SCHEMA.COLUMNSWHERE 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;
if exists (select *from INFORMATION_SCHEMA.COLUMNSwhere TABLE_NAME = '<table_name>'and COLUMN_NAME = '<column_name>') beginprint 'Column you have specified exists'end else beginprint 'Column does not exist'end

另一种变化…

SELECTCount(*) AS existFlagFROMsys.columnsWHERE[name] = N 'ColumnName'AND [object_id] = OBJECT_ID(N 'TableName')

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

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

小麦的回答很好,但它假设您在任何模式或数据库中没有任何相同的表名/列名对。为了使其对该条件安全,请使用此…

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

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

 sys.objectssys.columns

甚至可以使用其他一些访问方法来检查system catalog.

此外,无需使用SELECT *,只需通过NULL value进行测试

IF EXISTS(SELECT NULLFROM INFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME = 'myTableName'AND COLUMN_NAME = 'myColumnName')

对于那些在删除列之前检查列存在的人来说。

SQLServer 2016开始,您可以使用新的DIE(如果存在则删除)语句而不是大的IF包装器

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

下面是一个简单的脚本,我用它来管理数据库中的列添加:

IF NOT EXISTS (SELECT *FROM sys.ColumnsWHERE Name = N'QbId'AND Object_Id = Object_Id(N'Driver'))BEGINALTER TABLE Driver ADD QbId NVARCHAR(20) NULLENDELSEBEGINPRINT 'QbId is already added on Driver'END

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

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

IF COL_LENGTH('Table_Name','Column_Name') IS NULLBEGIN-- Column Not Exists, implement your logicENDELSEBEGIN-- Column Exists, implement your logicEND

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

IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)BEGINSELECT 'Column Already Exists.'ENDELSEBEGINALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]END
IF EXISTS(SELECT 1 FROM sys.columnsWHERE Name = N'columnName'AND Object_ID = Object_ID(N'schemaName.tableName'))

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

表→脚本表→新窗口-您有设计脚本。

检查并在新窗口中找到列名。

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

IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULLPRINT 'Column Exists in the given table';
IF EXISTS (SELECT *FROM INFORMATION_SCHEMA.COLUMNSWHERE 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 tableEND
ELSE BEGIN-- Column does not exist in tableEND

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

    USE [Northwind]GO
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = 'Categories'AND COLUMN_NAME = 'Note')BEGIN
ALTER TABLE Categories ADD Note NVARCHAR(800) NULL
ENDGO

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

BEGINIF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)BEGIN// Do somethingENDEND;

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

BEGINIF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)BEGIN// Do somethingENDEND;

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

IF EXISTS(SELECT *FROM INFORMATION_SCHEMA.COLUMNSWHERE 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];ELSESELECT 'Column does not exist in table' AS[Status];