如果不存在,我需要添加一个特定的列。我有类似以下内容,但它总是返回false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
如何检查SQL Server数据库的表中是否存在列?
如果不存在,我需要添加一个特定的列。我有类似以下内容,但它总是返回false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
如何检查SQL Server数据库的表中是否存在列?
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
马丁史密斯的版本更短:
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 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
我更喜欢 INFORMATION_SCHEMA.COLUMNS
在系统表上,因为Microsoft不保证在版本之间保留系统表。例如, dbo.syscolumns
仍然可以在SQL 2008中使用,但它已被弃用,并且可以在将来的任何时候删除。
您可以使用信息架构系统视图来查找您感兴趣的表的几乎所有内容:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
您还可以使用Information_schema视图查询视图,存储过程以及有关数据库的任何内容。
先检查一下 table
/column
(id
/name
)组合存在于 dbo.syscolumns
(包含字段定义的内部SQL Server表),如果没有,则发出相应的 ALTER TABLE
查询添加它。例如:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
尝试以下方法:
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 2016 你可以使用新的DIE语句而不是大的 IF
包装
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
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