java.sql 表是否存在_如何检查SQL Server表中是否存在列?

回答(24)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以使用信息架构系统视图来查找您感兴趣的表的几乎所有内容:

SELECT *

FROM INFORMATION_SCHEMA.COLUMNS

WHERE TABLE_NAME = 'yourTableName'

ORDER BY ORDINAL_POSITION

您还可以使用Information_schema视图查询视图,存储过程以及有关数据库的任何内容 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我更喜欢 INFORMATION_SCHEMA.COLUMNS 而不是系统表,因为Microsoft不保证在版本之间保留系统表 . 例如, dbo.syscolumns 仍然可以在SQL 2008中使用,但它已被弃用,并且可以在将来的任何时候删除 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是一个简单的脚本,用于管理数据库中的列添加:

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

下面的查询可用于检查表中是否存在搜索列 . 我们可以根据搜索结果做出决定,如下所示 .

IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = AND COLUMN_NAME = )

BEGIN

SELECT 'Column Already Exists.'

END

ELSE

BEGIN

ALTER TABLE ADD [Size]

END

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

调整以下内容以满足您的特定要求:

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,例如你的插入被应用?在任何一个语句中,您的表/列名称都有拼写错误吗?

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

最简单易懂的解决方案之一是:

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

Wheat的答案很好,但假设您在任何架构或数据库中没有任何相同的表名/列名对 . 为了使其安全,请使用此...

select *

from Information_Schema.Columns

where Table_Catalog = 'DatabaseName'

and Table_Schema = 'SchemaName'

and Table_Name = 'TableName'

and Column_Name = 'ColumnName'

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

首先检查 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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

if (exists(select 1

from tempdb.sys.columns

where Name = 'columnName'

and Object_ID = object_id('tempdb..#tableName')))

begin

...

end

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

试试这个

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')

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

有几种方法可以检查列的存在 . 我强烈建议使用 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'

)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

尝试以下方法:

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,但不明白为什么不 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于正在检查列存在的人来说 .

在 SQL Server 2016 中,您可以使用新的DIE语句而不是大的 IF 包装器

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我需要类似于SQL SERVER 2000,正如@Mitch指出的那样,这只适用于2005年 .

它应该对其他人有帮助吗,这最终对我有用:

if exists (

select *

from

sysobjects, syscolumns

where

sysobjects.id = syscolumns.id

and sysobjects.name = 'table'

and syscolumns.name = 'column')

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我的一位好朋友和同事向我展示了如何在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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

if exists (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='' and COLUMN_NAME='')

begin

print 'Column you have specified exists'

end

else

begin

print 'Column does not exists'

end

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

试试这个...

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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;

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这在SQL 2000中对我有用:

IF EXISTS

(

SELECT *

FROM INFORMATION_SCHEMA.COLUMNS

WHERE table_name = 'table_name'

AND column_name = 'column_name'

)

BEGIN

...

END

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

select distinct object_name(sc.id)

from syscolumns sc,sysobjects so

where sc.name like '%col_name%' and so.type='U'

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

更简洁的版本

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 )始终只返回有关已提交更改的数据,而与生效的隔离级别无关 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

另一种变化......

SELECT Count(*) AS existFlag FROM sys.columns

WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值