Sql server 如何检查SQL Server表中是否存在列?
我需要添加一个特定的列,如果它不存在。我有如下内容,但它总是返回false:Sql server 如何检查SQL Server表中是否存在列?,sql-server,sql-server-2008,tsql,sql-server-2012,sql-server-2016,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,Sql Server 2016,我需要添加一个特定的列,如果它不存在。我有如下内容,但它总是返回false: IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTableName' AND COLUMN_NAME = 'myColumnName') 如何检查SQL Server数据库的表中是否存在列?试试这个 IF NOT EXISTS( SEL
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
调整以下内容以满足您的具体要求:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
编辑来处理编辑到问题:这应该行得通——仔细检查你的代码是否有愚蠢的错误;例如,您是否在应用insert的同一数据库上查询信息\u架构?这两条语句中的表/列名是否有输入错误?首先检查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
您可以使用信息架构系统视图查找您感兴趣的表的几乎所有信息:
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
它应该可以在SQLServer2000和SQLServer2005上使用。不确定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
马丁·史密斯的版本较短:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
我更喜欢INFORMATION_SCHEMA.COLUMNS而不是系统表,因为Microsoft不保证在不同版本之间保留系统表。例如,dbo.syscolumns在SQL 2008中仍然可以使用,但它已被弃用,将来可以随时删除。更简洁的版本
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('AdventureWorks2012.HumanResources.Department','ModifiedDate')
与使用元数据视图相比,此答案的一个不同之处在于,诸如COL_LENGTH之类的元数据函数始终只返回有关已提交更改的数据,而与有效的隔离级别无关。这在SQL 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')
我需要类似的SQL SERVER 2000,正如@Mitch指出的,这只适用于M 2005+ 如果它能帮助其他人,这就是最终对我起作用的原因:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
我的一位好朋友和同事向我展示了如何在SQLServer2005+中使用带有SQL函数OBJECT_ID和COLUMNPROPERTY的IF块来检查列。您可以使用类似于以下内容的内容:
还有另一种变化
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
的临时表版本:
小麦的答案是好的,但假设您在任何模式或数据库中没有任何相同的表名/列名对。为了确保在这种情况下安全,请使用此
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
甚至可以使用其他一些访问方法来检查系统目录
此外,无需使用SELECT*,只需通过NULL值对其进行测试即可
用于在删除列之前检查列是否存在的人员 从SQL Server 2016开始,您可以使用新的DIE语句,而不是大型IF包装器
下面是一个简单的脚本,用于管理数据库中列的添加:
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
在本例中,名称是要添加的ColumnName,对象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(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';
另一个贡献是下面的示例,它添加了列(如果不存在)
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
希望能有帮助。
Simone如果列不存在,请执行以下操作:
如果列存在,请执行以下操作:
我刚刚发现,在where子句之后添加TABLE_SCHEMA='mySchema'可以解决问题。-1:没有回答OP的问题,只添加了关于如何添加新COLLMN的新信息,尽管OP根本没有问这个问题,不回应OP的评论。+1完美地回答了OP的问题,并附带了OP下一步要提供的额外信息。这就是我想要的。这比其他答案可读性差,可能是为什么它没有那么高的评价。@Bill-什么方面可读性差?在Firefox中看起来不错。这个答案发布的时间比被接受的答案晚了2年多,这解释了IMO的评级。如果你的意思是不太清楚它是否存在,那么这种习惯用法在SQL Server中非常常见。e、 g.使用IF OBJECT_ID'TableName',U'为NULL来检查对象是否存在o
r DB_ID'foo'检查数据库是否存在。@Martin Smith我肯定他的意思是可读性较差,因为如果您不知道这个习惯用法,并且您从其他人那里继承了该代码,您将无法立即理解该代码的功能。类似于在C++中编写x> 2而不是x/4。如果存在更详细的代码,请从信息\u架构中选择列\u名称。。。需要更多的空间,但没有人会挠头试图弄清楚它的作用。此外,更简洁的是,这是一种更快的解决方案。访问信息\u SCHEMA views或sys.columns会访问磁盘,而COL\u LENGTH使用缓存的数据库元数据。这可能不是评价最高的答案,因为它比另一个答案晚2.5年。这就是为什么我总是在比较两个答案的评分时检查日期。克服之前给出的答案需要更长的时间;是的,这是不言而喻的,因为信息模式视图只包含ANSI标准元数据。但是,这对于存在性测试来说已经足够了。Microsoft表示,在SQL Server的未来版本中,Microsoft可能会通过在列列表的末尾添加列来扩展任何系统目录视图的定义。我们建议不要在生产代码中使用语法SELECT*FROM sys.catalog_view_name,因为返回的列数可能会更改并中断应用程序。这意味着它们不会删除列或更改其顺序。这对于除边缘情况外的所有情况来说都足够好的向后兼容性。我实际上不认为问题中的代码有任何问题:在2008 R2中对我很好。也许你用错数据库了?也许您的数据库区分大小写,而您的myTableName/myColumnName字符串中没有大小写?这种类型的查询似乎比COL_-LENGTH解决方案更灵活:我可以在不同的数据库上运行它,甚至可以通过适当地为INFORMATION_-SCHEMA添加前缀,在数据库链接上运行它。看不到如何使用COL_LENGTH元数据函数实现此功能。@mwardm-COL_LENGTH“AdventureWorks2012.HumanResources.Department”和“ModifiedDate”效果很好。相关提示:如果您想在添加列后立即更新列,我相信许多用户都在为此搜索本文,您可以将EXEC sp_executesql与格式化的UPDATE语句一起使用。真正的答案是您应该添加要检查的数据库,使其来自[YourDatabase]。INFORMATION_SCHEMA.Columnsy您还可以非常简单地使用syscolumns和sysobjects。此方法也适用于SQL CE,但是,上面提到的其他一些方法没有。您可以使用SELECT 1而不是SELECT TOP 1;。在一个存在语句中,SQL自动地优化列,就像Cuth*一样,因此选择*就足够了。为了完整性,您应该考虑将WHERE子句添加和[TabLEYStudio]=???。您可以省略条件的第一部分,只检查COLUMNPROPERTY。这与公认的答案有什么不同?临时表在接受的答案中是否不起作用?正确。接受的答案不适用于临时表,因为必须将“sys.columns”指定为“tempdb.sys.columns”,并且表名必须以“tempdb..”开头。您不需要SCHEMA.tables的信息,也不筛选特定表的列,因此它有时会为单独表中的相同列名返回多行;。无论您选择*with EXISTS,因为当使用EXISTS时,它并不真正选择所有的行和列,在内部它只是检查是否存在,而不是实际检查所有的行和列在Martin Smith的版本中,有一件事需要提及的是不要将columnName包含在方括号[]中。当columnName位于方括号[]内时,即使该列存在于table@HemendraSinghChauhan-那是因为它们不是名字的一部分。当与sys中的名称进行比较时,您还会发现。columns@MartinSmith我不知道,我用了你的答案,发现了这个。通常我在添加列时使用方括号,所以我也在colu_LENGTH函数中使用它们。我的代码是这样的:altertable\u Name添加[ColumnName]NVarcharmax NULL;选择列长度“[表名称]”,“[列名称]”是,这是无效的。COL_LENGTH的参数需要不带引号。从理论上讲,有人可以创建一个实际名称为[column_name]的列,例如,创建表T[[column_name]]]INT;从T中选择*如果不是规则,则会有歧义。当字段id varcharmax=null时,较短版本不起作用这正是问卷使用的内容,他需要知道如何添加不存在的列。
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
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
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(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 EXISTS 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;
//Only checks
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 EXISTS IN TABLE
END