如果它不存在,我需要添加一个特定的列。我有类似以下的内容,但它总是返回 false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
如何检查 SQL Server 数据库的表中是否存在列?
COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate')
工作正常。
EXEC sp_executesql
和形成的 UPDATE
语句。
FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS
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
更简洁的版本
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
使用缓存的数据库元数据。
调整以下内容以满足您的特定要求:
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
SELECT 1
代替 SELECT TOP 1 1
;)。
EXISTS
语句中,SQL 会自动优化列(很像 count(*)
),因此 SELECT *
就足够了。
and [TABLE_SCHEMA] = '???'
添加到 WHERE 子句中。
对于在删除列之前检查列存在的人。
从 SQL Server 2016 开始,您可以使用新的 DIE (Drop If Exists) 语句代替大型 IF
包装器
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
我更喜欢 INFORMATION_SCHEMA.COLUMNS
而不是系统表,因为 Microsoft 不保证在版本之间保留系统表。例如,dbo.syscolumns
在 SQL Server 2008 中仍然有效,但它已被弃用,将来可能随时被删除。
INFORMATION_SCHEMA
视图仅包含 ANSI 标准元数据。但是,这对于存在测试来说已经足够了。
您可以使用信息模式系统视图来查找有关您感兴趣的表的几乎所有信息:
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,但我不明白为什么不这样做。
首先检查 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
我的一位好朋友和同事向我展示了如何在 SQL Server 2005 中使用带有 SQL 函数 OBJECT_ID
和 COLUMNPROPERTY
的 IF
块以及稍后检查列。您可以使用类似于以下内容的内容:
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
COLUMNPROPERTY
。
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 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 points out,这仅适用于 SQL Server 2005 或更高版本。
这最终对我有用:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
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
accepted answer 的临时表版本:
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
最简单易懂的解决方案之一是:
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
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
有几种方法可以检查列的存在。我强烈建议使用 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
,因为当使用 exists 时,它并不会真正选择所有行和所有列,在内部它只是检查是否存在,而不是实际检查所有行和列
Wheat's answer 很好,但它假定您在任何架构或数据库中没有任何相同的表名/列名对。为了使其在这种情况下安全,请使用此...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
如果该列不存在,请执行以下操作:
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;
这是我用来管理在数据库中添加列的简单脚本:
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
另一个贡献是以下示例,如果该列不存在,则添加该列。
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
以下查询可用于检查表中是否存在搜索列。我们可以根据搜索结果做出决定,也如下图所示。
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
还有一个变种...
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
您可以一次检查 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];
执行以下查询以检查给定表中是否存在该列:
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
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
这应该是解决此问题的相当简单的方法和直接的解决方案。对于类似的场景,我已经多次使用它。它就像一个魅力,毫无疑问。
不定期副业成功案例分享
sys.columns
中的名称进行比较时,您还会发现IS NOT NULL
而不是>0