Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL表中,我有一个用于删除列的SQL脚本,它给出了一个错误:无效列不存在_Sql_Sql Server - Fatal编程技术网

在SQL表中,我有一个用于删除列的SQL脚本,它给出了一个错误:无效列不存在

在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

因此,我在SQL数据库示例_表中创建了一个表,其中包含以下列:-

Id、名字、最后一封电子邮件、电子邮件、用户类型

现在,我想编写一个脚本来删除列user_type(如果存在)。 因此,我有以下脚本:-

 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是对的,但有没有替代动态查询的方法