Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Tsql - Fatal编程技术网

Sql 执行(';更新';)和更新新列之间的差异

Sql 执行(';更新';)和更新新列之间的差异,sql,tsql,Sql,Tsql,我必须添加一个不可为null的列,但我没有默认值,因此我将该列创建为可为null,然后更新所有行,然后将该列更改为不可为null 运行以下脚本已成功完成 BEGIN ALTER TABLE driver ADD DriverLocationId INT NULL EXEC('UPDATE driver SET DriverLocationId = (SELECT TOP(1) CountryId FROM Country WHERE CountryCode IN (''

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

运行以下脚本已成功完成

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在那里不起作用

首先:删除“USA”的额外单引号,改用“USA”。当然,其他值也是如此


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

字符串在“UPDATE…”处打开。。。您的建议将关闭字符串…在哪里输入ContryCode('我已经更新了我的问题。很抱歉双引号。这不是问题。这里有更复杂的问题。在第二种情况下,SQL还没有看到列已被添加。提到的GO语句可以使该列工作,但在这段代码中不工作,因为它位于BEGIN和END标记之间。我相信EXEC执行新会话中的语句,因此不受此问题的影响。如果您为第二个会话提供了实际的错误消息,则问题将更加明显。SQL Server无法编译所有代码,因此没有任何代码会执行。这就是为什么需要在单独的批处理(以便在编译时,列存在)我明白。请将此作为答案或标记为副本。非常感谢Damien。问题在于命令go,它正在结束您的交易。请尝试使用it@MelgoV绝对不是。GO只是SQL server中的一个批处理分隔符,仅此而已。它不会结束或终止事务。@MelgoV-
BEGIN…end
与事务无关。事务由
BEGIN TRANSACTION
ROLLBACK[TRANSACTION]
COMMIT[TRANSACTION]
控制-因此,虽然您可能对控制结构被分解有一个有效的观点,但它与事务无关。