可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I need to add a specific column if it is does not exist. I have something like this, but it always returns false:
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTableName' AND COLUMN_NAME = 'myColumnName')
How can I check if a column exists in a table of SQL Server database?
回答1:
SQL Server 2005 onwards:
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's version is shorter:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL BEGIN -- Column Exists END
回答2:
A more concise version
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
The point about permissions on viewing metadata applies to all answers not just this one.
Note that the first parameter table name to COL_LENGTH
can be in one, two, or three part name format as required.
An example referencing a table in a different database is
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
One difference with this answer compared to using the metadata views is that metadata functions such as COL_LENGTH
always only return data about committed changes irrespective of the isolation level in effect.
回答3:
Tweak the below to suit your specific requirements:
if not exists (select column_name from INFORMATION_SCHEMA.columns where table_name = 'MyTable' and column_name = 'MyColumn') alter table MyTable add MyColumn int
Edit to deal with edit to question: That should work - take a careful look over your code for stupid mistakes; are you querying INFORMATION_SCHEMA on the same database as your insert is being applied to for example? Do you have a typo in your table/column name in either statement?
回答4:
Try this...
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
回答5:
I'd prefer INFORMATION_SCHEMA.COLUMNS
over a system table because Microsoft does not guarantee to preserve the system tables between versions. For example, dbo.syscolumns
does still work in SQL 2008, but it's deprecated and could be removed at any time in future.
回答6:
You can use the information schema system views to find out pretty much anything about the tables you're interested in:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'yourTableName' ORDER BY ORDINAL_POSITION
You can also interrogate views, stored procedures and pretty much anything about the database using the Information_schema views.
回答7:
First check if the table
/column
(id
/name
) combination exists in dbo.syscolumns
(an internal SQL Server table that contains field definitions), and if not issue the appropriate ALTER TABLE
query to add it. For example:
IF NOT EXISTS ( SELECT * FROM syscolumns WHERE id = OBJECT_ID('Client') AND name = 'Name' ) ALTER TABLE Client ADD Name VARCHAR(64) NULL
回答8:
Try something like:
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
Then use it like this:
IF ColumnExists('xxx', 'yyyy') = 'F' BEGIN ALTER TABLE xxx ADD yyyyy varChar(10) NOT NULL END GO
It should work on both SQL Server 2000 & SQL Server 2005. Not sure about SQL Server 2008, but don't see why not.
回答9:
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
回答10:
A good friend and colleague of mine showed me how you can also use an IF
block with SQL functions OBJECT_ID
and COLUMNPROPERTY
in SQL SERVER 2005+ to check for a column. You can use something similar to the following:
You can see for yourself here
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:
For the people who is checking the column existence to drop it.
In SQL Server 2016 you can use new DIE statements instead of big IF
wrappers
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
回答12:
This worked for me in SQL 2000:
IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'table_name' AND column_name = 'column_name' ) BEGIN ... END
回答13:
Try this
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:
I needed similar for SQL SERVER 2000 and, as @Mitch points out, this only works inm 2005+.
Should it help anyone else, this is what worked for me in the end:
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 exists' end
回答16:
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;
回答17:
select distinct object_name(sc.id) from syscolumns sc,sysobjects so where sc.name like '%col_name%' and so.type='U'
回答18:
A temp table version of the accepted answer:
if (exists(select 1 from tempdb.sys.columns where Name = 'columnName' and Object_ID = object_id('tempdb..#tableName'))) begin ... end
回答19:
Wheat's answer is good, but assumes you do not have any identical table name / column name pairs in any schema or database. To make it safe for that condition use this...
select * from Information_Schema.Columns where Table_Catalog = 'DatabaseName' and Table_Schema = 'SchemaName' and Table_Name = 'TableName' and Column_Name = 'ColumnName'
回答20:
One of the most simple and understandable solution is:
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
回答21:
There are several ways to check the existence of a column. I would strongly recommend to use INFORMATION_SCHEMA.COLUMNS as it is created in order to communicate with user. Consider following tables:
sys.objects sys.columns
and even some other access methods available to check system catalog.
Also, no need to use SELECT *, simply test it by NULL value
IF EXISTS( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTableName' AND COLUMN_NAME = 'myColumnName' )
回答22:
Here is a simple script I use to manage addition of columns in the database:
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
In this example, the Name
is the ColumnName
to be added and Object_Id
is the TableName
回答23:
Yet another variation...
SELECT Count(*) AS existFlag FROM sys.columns WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')
回答24:
The commercial product I am working with uses a query similar to the one below, checking for the existence of all the required columns at once. The query and in particular the list of columns is created in the software.
SELECT COUNT(Column1+Column2+...+ColumnN) FROM [Tablename] WHERE ID=NULL
The query is presented to the server via software and an ODBC link to the database and is run for our C++ program within a try-catch exception handler.
If the query runs okay, the columns exist. If the query fails, then further queries are executed and the missing columns created etc, so that our software always has the tables and columns it needs to run correctly. Older databases are updated to add the columns they are missing.
The solution differs from many solutions above since it is running from software and it can handle database servers which predate certain SQL server systems tables and functions like INFORMATION_SCHEMA.COLUMNS, sys.columns and object_id() some of which are vendor specific anyway and do not provide a general solution across Microsoft SQL server and Adobe MySQL products etc.
If your queries are run by your own software and an ODBC connection to the SQL Server, and you want them to run with databases other than SQL Server too, then this approach might be worth consideration.
This post has been down-voted numerous times. I know its not a solution for most people since it is for integration within software, and I know it's not fashionable to provide something that works with legacy systems rather than assuming and relying on up to date technology. The try-catch idea is ugly and the use of WHERE ID=NULL to return a single value regardless of actual table contents is not straight forward either. But despite the down votes I am leaving this here in case it helps someone.
回答25:
Use this query:
IF EXISTS(SELECT Statement) BEGIN Code END ELSE BEGIN Code END OR IF NOT EXISTS( Select Statement) Begin code End ELSE Begin code End
This way you can use the conditions in SQL.
Hope it helps.
回答26:
I would best go for
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTableName' AND COLUMN_NAME = 'myColumnName')
This check if the table exists as well as the column in the particular table exists. Tried only on MYSQL
though, didn't try it for other databases.
A bit different in the Oracle
database.
Select count(*) from user_tab_cols where column_name = 'myColumnName' and table_name = 'myTableName';
This would return you either 1 if a column exists in a particular table, 0 if not present. More of a PL/SQL
thing though.