提问人:Maciej 提问时间:9/25/2008 最后编辑:Peter MortensenMaciej 更新时间:3/7/2023 访问量:1617835
如何检查 SQL Server 表中是否存在列
How to check if a column exists in a SQL Server table
问:
如果不存在,我需要添加一个特定的列。我有类似以下内容的东西,但它总是返回 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
评论
SELECT 1
SELECT TOP 1 1
EXISTS
count(*)
SELECT *
and [TABLE_SCHEMA] = '???'
调整以下内容以满足您的特定要求:
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 exists
if not exists
*
column_name
alter table …
首先检查(包含字段定义的内部 SQL Server 表)中是否存在 /(/) 组合,如果没有,则发出相应的查询来添加它。例如:table
column
id
name
dbo.syscolumns
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
评论
sys.columns
Alter table Table_Name Add [ColumnName] NVarchar(max) NULL; Select COL_LENGTH('[TABLE_NAME]', '[COLUMN_NAME]')
IS NOT NULL
>0
我更喜欢系统表,因为 Microsoft 不保证在版本之间保留系统表。例如,在 SQL Server 2008 中仍然有效,但它已被弃用,将来可以随时删除。INFORMATION_SCHEMA.COLUMNS
dbo.syscolumns
评论
INFORMATION_SCHEMA
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
评论
更简洁的版本
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 OBJECT_ID('TableName','U') IS NULL
DB_ID('foo')
x>>2
x/4
if exists (select column_name from information_schema ...)
INFORMATION_SCHEMA
sys.columns
COL_LENGTH
这在 SQL Server 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')
评论
INFORMATION_SCHEMA.TABLES
我需要 SQL Server 2000 的类似功能,正如 Mitch 指出的那样,这仅适用于 SQL Server 2005 或更高版本。
这就是最终对我有用的东西:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
我的一位好朋友和同事向我展示了如何在 SQL 函数中使用块,并在 SQL Server 2005 及更高版本中检查列。您可以使用类似于以下内容的内容:IF
OBJECT_ID
COLUMNPROPERTY
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
评论
COLUMNPROPERTY
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
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;
评论
if exists (
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '<table_name>'
and COLUMN_NAME = '<column_name>'
) begin
print 'Column you have specified exists'
end else begin
print 'Column does not exist'
end
又一个变化......
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
评论
已接受答案的临时表版本:
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'
)
评论
SELECT *
EXISTS
适用于在删除列之前检查列是否存在的人员。
从 SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 20IF
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
评论
ALTER TABLE table_name ADD COLUMN IF NOT EXISTS
下面是我用来管理数据库中列添加的简单脚本:
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
以下查询可用于检查表中是否存在搜索到的列。我们可以根据搜索结果做出决定,如下所示。
IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
BEGIN
SELECT 'Column Already Exists.'
END
ELSE
BEGIN
ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
END
IF EXISTS(SELECT 1 FROM sys.columns
WHERE 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 NULL
PRINT 'Column Exists in the given table';
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 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 table
END
ELSE BEGIN
-- Column does not exist in table
END
另一个贡献是以下示例,如果该列不存在,则添加该列。
USE [Northwind]
GO
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Categories'
AND COLUMN_NAME = 'Note')
BEGIN
ALTER TABLE Categories ADD Note NVARCHAR(800) NULL
END
GO
如果该列不存在,请执行以下操作:
BEGIN
IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)
BEGIN
// Do something
END
END;
如果该列确实存在,请执行以下操作:
BEGIN
IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)
BEGIN
// Do something
END
END;
评论
可以一次检查 SQLDB 中的多个列,并返回字符串作为状态以检查列是否存在:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 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];
ELSE
SELECT 'Column does not exist in table' AS[Status];
INFORMATION_SCHEMA使用当前数据库,必须首先调用“使用 [MyDatabase]”
上一个:是什么使 SQL 语句可优化?
评论
COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate')
EXEC sp_executesql
UPDATE
FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS