在SQL表中,我有一个用于删除列的SQL脚本,它给出了一个错误:无效列不存在
因此,我在SQL数据库示例_表中创建了一个表,其中包含以下列:- Id、名字、最后一封电子邮件、电子邮件、用户类型 现在,我想编写一个脚本来删除列user_type(如果存在)。 因此,我有以下脚本:-在SQL表中,我有一个用于删除列的SQL脚本,它给出了一个错误:无效列不存在,sql,sql-server,Sql,Sql Server,因此,我在SQL数据库示例_表中创建了一个表,其中包含以下列:- Id、名字、最后一封电子邮件、电子邮件、用户类型 现在,我想编写一个脚本来删除列user_type(如果存在)。 因此,我有以下脚本:- IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sample_table' and COLUMN_NAME = 'user_type') BE
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'sample_table'
and COLUMN_NAME = 'user_type')
BEGIN
ALTER TABLE sample_table
DROP COLUMN user_type
END
GO
根据脚本,if exists条件是正确的,但即使它给出编译时错误无效列user\u type不存在如果此脚本执行多次,是否存在
一些跳过错误的方法。
如果有的话,请你建议怎么做。
我用sys对象尝试过,也给出了同样的错误。
所以我只想知道是否有办法跳过这个错误?
如果有的话,除了使用动态查询还有别的方法吗
提前感谢。如果您可以容忍多个批处理,但由于某种原因无法容忍动态SQL,则可以使用
NOEXEC
:
IF NOT EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'sample_table'
and COLUMN_NAME = 'user_type')
BEGIN
SET NOEXEC ON
END
GO
ALTER TABLE sample_table
DROP COLUMN user_type
GO
SET NOEXEC OFF
无论哪种方式,重要的是,在验证必要的对象存在之前,不要尝试编译
ALTER TABLE
语句。如果您可以容忍多个批处理,但由于某种原因无法容忍动态SQL,则可以使用NOEXEC
:
IF NOT EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'sample_table'
and COLUMN_NAME = 'user_type')
BEGIN
SET NOEXEC ON
END
GO
ALTER TABLE sample_table
DROP COLUMN user_type
GO
SET NOEXEC OFF
无论哪种方法,重要的是,在验证必要的对象存在之前,不要尝试编译
ALTER TABLE
语句。一个快速的方法是将ALTER TABLE
放入动态查询中。我想避免使用动态查询代码无法编译。您需要将ALTER
移动到不同的范围(如Guido所说的动态SQL),以便编译外部部分,使其能够对信息模式执行运行时检查执行多次似乎意味着您正在生成一个存储过程。这有点“脏”,但我会更改表示例\u TABLE添加列user\u type int
,然后继续创建/更改过程,然后删除列。是的,我知道@GuidoG是对的,但是有没有替代动态查询的方法?快速的方法是将ALTER TABLE
放在动态查询中。我想避免使用动态查询。代码无法编译。您需要将ALTER
移动到不同的范围(如Guido所说的动态SQL),以便编译外部部分,使其能够对信息模式执行运行时检查执行多次似乎意味着您正在生成一个存储过程。这有点“脏”,但我会更改表sample\u TABLE添加列user\u type int
,然后继续创建/更改过程,然后删除列。是的,我知道@GuidoG是对的,但有没有替代动态查询的方法