如果不存在,我需要添加一个特定的列.我有类似以下内容,但它总是返回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
始终只返回有关已提交更改的数据,而不管有效的隔离级别如何.
调整以下内容以满足您的特定要求:
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视图查询视图,存储过程以及有关数据库的任何内容.
对于正在检查列存在的人来说.
在SQL Server 2016中,您可以使用新的DIE语句而不是大IF
包装器
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
首先检查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
尝试类似的东西:
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,但不明白为什么不.
我的一位好朋友和同事向我展示了如何使用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
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 2000中对我有用:
IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'table_name' AND column_name = 'column_name' ) BEGIN ... END
试试这个
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 SERVER 2000,正如@Mitch指出的那样,这只适用于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 = '' and COLUMN_NAME = ' ' ) begin print 'Column you have specified exists' end else begin print 'Column does not exist' end
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;
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
Wheat的答案很好,但假设您在任何架构或数据库中没有任何相同的表名/列名对.为了使其安全,请使用此...
select * from Information_Schema.Columns where Table_Catalog = 'DatabaseName' and Table_Schema = 'SchemaName' and Table_Name = 'TableName' and Column_Name = 'ColumnName'
有几种方法可以检查列的存在.我强烈建议使用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' )
这是我用来管理数据库中列添加的简单脚本:
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_Id
是TableName
最简单易懂的解决方案之一是:
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