【问题标题】:Difference between EXEC('UPDATE') and UPDATE for a new column [duplicate]新列的 EXEC('UPDATE') 和 UPDATE 之间的区别 [重复]
【发布时间】:2015-07-07 19:11:56
【问题描述】:

我必须添加一个 Not Nullable 列,但我没有已知的默认值,因此我将该列创建为 Nullable,然后更新所有行然后将列更改为 Not Nullable

成功运行以下脚本。

BEGIN
    ALTER TABLE driver ADD DriverLocationId INT NULL
    EXEC('UPDATE driver 
    SET DriverLocationId = (SELECT TOP(1) CountryId FROM Country WHERE CountryCode IN (''USA'',''CAN'', ''MEX''))')
    ALTER TABLE driver ALTER COLUMN DriverLocationId INT NOT NULL   
END

以下是失败的。

BEGIN
    ALTER TABLE driver ADD DriverLocationId INT NULL
    UPDATE driver 
        SET DriverLocationId = (SELECT TOP(1) CountryId FROM Country WHERE CountryCode IN ('USA','CAN', 'MEX'))
    ALTER TABLE driver ALTER COLUMN DriverLocationId INT NOT NULL   
 END

可能在更改后正确执行第一次尝试的更新脚本时。

你对此有什么解释吗?

编辑:我已经更新了我的问题。对不起,双引号。那不是问题。这是更复杂的事情。

编辑:错误是:

列名“DriverLocationId”无效。

编辑(针对@Stephan): GO 不在那里工作

【问题讨论】:

  • 如果您为第二个提供了实际的错误消息,问题会更加明显。 SQL Server 未能编译所有代码,因此没有任何代码执行。这就是为什么您需要 UPDATE 讨论新列的原因,以便在单独的批次中(以便在编译时,该列存在)
  • 我明白了。请将此作为答案发布或标记为重复。非常感谢达米安。
  • 问题是命令 go,它正在结束你的事务。试一试
  • @MelgoV 绝对不是。 GO 是 SQL Server 中的批处理分隔符,仅此而已。它不会结束或终止交易。
  • @MelgoV - BEGIN ... END 与交易无关。事务由BEGIN TRANSACTIONROLLBACK [TRANSACTION]COMMIT [TRANSACTION] 控制 - 因此,虽然您可能对控制结构被破坏有一个正确的观点,但它与事务无关。

标签: sql tsql


【解决方案1】:

首先:删除 ''USA'' 的额外单引号并改用 'USA'。当然,其他值也一样。

然后,正如我在评论中所说:在第二种情况下,SQL 还没有看到该列已被添加。上面提到的 GO 语句可以使它起作用,但在此代码中不起作用,因为它位于 BEGIN 和 END 标记之间。我相信 EXEC 在新会话中执行语句,因此不会受到这个问题的阻碍。

【讨论】:

  • 字符串在 'UPDATE... 打开... 您的建议将在 ...WHERE Con​​tryCode IN ('
  • 我已经更新了我的问题。对不起,双引号。那不是问题。这是更复杂的事情。
  • 在第二种情况下,SQL 还没有看到该列已被添加。上面提到的 GO 语句可以使它起作用,但在此代码中不起作用,因为它位于 BEGIN 和 END 标记之间。我相信 EXEC 在新会话中执行语句,因此不会受到这个问题的阻碍。
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2012-06-04
  • 2014-04-12
  • 2013-02-24
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多