【问题标题】:Alter then update causes an error改变然后更新导致错误
【发布时间】:2017-02-28 10:13:48
【问题描述】:

我有简单的脚本:

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.Columns 
               WHERE table_name = 'T1' AND column_name = 'C1')
BEGIN
    ALTER Table T1
        ADD C1 BIT NOT NULL CONSTRAINT DF_T1_C1 DEFAULT 0   

   UPDATE Table T1 
   SET C1 = 1
END
GO

我遇到错误

关键字“表”附近的语法不正确。

我尝试了this solution,但它没有更新列值。我遇到了this,但我认为这不是我的情况,因为我不想捕获异常或进行任何交易。我有简单的选择吗?

放置 GO 分隔符也没有帮助。

正如 Joe Taras 指出的那样,我已经更改了脚本,但现在出现错误

列名“C1”无效。

【问题讨论】:

  • 新错误是因为首先批处理编译,然后执行。在尝试编译 UPDATE 语句时,不存在这样的列。
  • 你不能像我在我的解决方案中发布的那样更改默认值吗?那么你甚至不需要更新?!

标签: sql sql-server


【解决方案1】:

您需要确保 UPDATE 在您实际创建列之前编译

使用 EXEC 将其放在单独的上下文中:

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.Columns 
               WHERE table_name = 'T1' AND column_name = 'C1')
BEGIN
    ALTER Table T1
        ADD C1 BIT NOT NULL CONSTRAINT DF_T1_C1 DEFAULT 0   

   EXEC('UPDATE Table T1 
         SET C1 = 1')
END
GO

【讨论】:

  • +1 You need to ensure that that UPDATE isn't compiled until after you're actually created the column。完美。
【解决方案2】:

你的行:

UPDATE Table T1 SET C1 = 1

错了,因为你指定了table关键字。

正确的语法是:

UPDATE T1 SET C1 = 1

编辑 1

重写你的脚本如下,所以在 GO 分隔符之后你会更新你的字段,所以你确定 DDL 已经被 DBMS 占用了:

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.Columns
               where table_name = 'T1' AND column_name = 'C1')
BEGIN
    ALTER Table T1
    ADD C1 BIT NOT NULL CONSTRAINT DF_T1_C1 DEFAULT 0    
END
GO

UPDATE T1 SET C1 = 1

编辑 2

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.Columns
               where table_name = 'T1' AND column_name = 'C1')
BEGIN
    ALTER Table T1
    ADD C1 BIT NOT NULL CONSTRAINT DF_T1_C1 DEFAULT 0  

    EXEC('UPDATE T1 SET C1 = 1')  
END
GO

【讨论】:

  • 只有 'ALTER' 需要 'Table' 关键字。
  • 如果再次运行脚本,我无法将更新写入外部,因为如果再次运行脚本,它将更新 C1。它应该仅在创建列时运行。
【解决方案3】:

如果表中没有条目,则无法进行更新 输入一次就可以试一试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-06-12
    • 2013-11-09
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多