【发布时间】: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 TRANSACTION和ROLLBACK [TRANSACTION]或COMMIT [TRANSACTION]控制 - 因此,虽然您可能对控制结构被破坏有一个正确的观点,但它与事务无关。