如何检查SQL Server表中是否存在列?
时间:2020-03-06 14:43:03 来源:igfitidea点击:
如果它不存在,我需要添加一个特定的列。我有类似以下内容的内容,但始终返回false:
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTableName' AND COLUMN_NAME = 'myColumnName')
如何检查SQL Server数据库表中是否存在列?
解决方案
试试这个...
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
调整以下内容以适合特定要求:
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?表/列名称中是否有错字?
首先检查dbo.syscolumns(包含字段定义的内部SQL Server表)中是否存在table / column(id / 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
我们可以使用信息模式系统视图来查找有关我们感兴趣的表的几乎所有信息:
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,但是看不出来为什么不可以。
从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
马丁·史密斯(Martin Smith)的版本较短:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL BEGIN -- Column Exists END
我宁愿使用INFORMATION_SCHEMA.COLUMNS
而不是系统表,因为Microsoft不保证在版本之间保留系统表。例如,dbo.syscolumns
在SQL 2008中仍然可以使用,但已过时,以后可以随时删除。