How to check if a column exists in a SQL Server table?

匿名 (未验证) 提交于 2019-12-03 02:49:01

问题:

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.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!