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
9
下面的查询可用于检查表中是否存在搜索列 . 我们可以根据搜索结果做出决定,如下所示 .
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
43
调整以下内容以满足您的特定要求:
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 :这应该有用 - 仔细查看代码中的愚蠢错误;你在同一数据库中查询INFORMATION_SCHEMA,例如你的插入被应用?在任何一个语句中,您的表/列名称都有拼写错误吗?
12
最简单易懂的解决方案之一是:
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 *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
16
首先检查 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
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
1801
试试这个
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')
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
4
尝试以下方法:
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,但不明白为什么不 .
10
对于正在检查列存在的人来说 .
在 SQL Server 2016 中,您可以使用新的DIE语句而不是大的 IF 包装器
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
-1
我需要类似于SQL SERVER 2000,正如@Mitch指出的那样,这只适用于2005年 .
它应该对其他人有帮助吗,这最终对我有用:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
26
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
19
我的一位好朋友和同事向我展示了如何在SQL SERVER 2005中使用带有SQL函数 OBJECT_ID 和 COLUMNPROPERTY 的 IF 块来检查列 . 您可以使用类似于以下内容的内容:
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
4
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 exists'
end
5
试试这个...
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
20
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;
66
这在SQL 2000中对我有用:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
28
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
26
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
22
更简洁的版本
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
24 回答
您可以使用信息架构系统视图来查找您感兴趣的表的几乎所有内容:
您还可以使用Information_schema视图查询视图,存储过程以及有关数据库的任何内容 .
我更喜欢
INFORMATION_SCHEMA.COLUMNS
而不是系统表,因为Microsoft不保证在版本之间保留系统表 . 例如,dbo.syscolumns
仍然可以在SQL 2008中使用,但它已被弃用,并且可以在将来的任何时候删除 .这是一个简单的脚本,用于管理数据库中的列添加:
在此示例中,
Name
是要添加的ColumnName
,Object_Id
是TableName
下面的查询可用于检查表中是否存在搜索列 . 我们可以根据搜索结果做出决定,如下所示 .
调整以下内容以满足您的特定要求:
Edit to deal with edit to question :这应该有用 - 仔细查看代码中的愚蠢错误;你在同一数据库中查询INFORMATION_SCHEMA,例如你的插入被应用?在任何一个语句中,您的表/列名称都有拼写错误吗?
最简单易懂的解决方案之一是:
Wheat的答案很好,但假设您在任何架构或数据库中没有任何相同的表名/列名对 . 为了使其安全,请使用此...
首先检查
dbo.syscolumns
(包含字段定义的内部SQL Server表)中是否存在table
/column
(id
/name
)组合,如果没有,则发出相应的ALTER TABLE
查询以添加它 . 例如:accepted answer的临时表版本:
试试这个
有几种方法可以检查列的存在 . 我强烈建议使用
INFORMATION_SCHEMA.COLUMNS
,因为它是为了与用户通信而创建的 . 考虑以下表格:甚至一些其他访问方法可用于检查
system catalog.
此外,无需使用
SELECT *
,只需通过NULL value
进行测试尝试以下方法:
然后像这样使用它:
它应该适用于SQL Server 2000和SQL Server 2005.不确定SQL Server 2008,但不明白为什么不 .
对于正在检查列存在的人来说 .
在 SQL Server 2016 中,您可以使用新的DIE语句而不是大的
IF
包装器我需要类似于SQL SERVER 2000,正如@Mitch指出的那样,这只适用于2005年 .
它应该对其他人有帮助吗,这最终对我有用:
我的一位好朋友和同事向我展示了如何在SQL SERVER 2005中使用带有SQL函数
OBJECT_ID
和COLUMNPROPERTY
的IF
块来检查列 . 您可以使用类似于以下内容的内容:You can see for yourself here
试试这个...
这在SQL 2000中对我有用:
SQL Server 2005以后:
马丁史密斯的版本更短:
更简洁的版本
关于查看元数据的权限的观点适用于所有答案,而不仅仅是这个答案 .
请注意,COL_LENGTH的第一个参数表名称可以根据需要采用一个,两个或三个部分名称格式 .
引用不同数据库中的表的示例是
与使用元数据视图相比,这个答案的一个不同之处在于元数据函数(如
COL_LENGTH
)始终只返回有关已提交更改的数据,而与生效的隔离级别无关 .另一种变化......