新列的EXEC('UPDATE')和UPDATE之间的差异

时间:2015-05-08 14:32:46

标签: sql tsql

我必须添加 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

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

你对此有任何解释吗?

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

编辑:错误是:

  

列名称'DriverLocationId'无效。

编辑(对于@Stephan): GO无效GO isn't working

1 个答案:

答案 0 :(得分:3)

首先:删除“美国”的额外单引号,然后使用“美国”代替。当然,其他值也是如此。

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