我使用以下脚本向表中添加列。当我在查询窗口中点击 F5 时,它会在fkRefTabNo
不存在的第二次更新查询中出错。
ALTER TABLE EPFieldSQLScripts
ADD fkRefTabNo int DEFAULT 1
update EPFieldSQLScripts
set fkRefTabNo = 1
where fkRefTabNo is null
ALTER TABLE EPFieldSQLScripts
ALTER COLUMN fkRefTabNo INTEGER NOT NULL
但是当我逐个运行这些查询时,它不会给出错误。谁能告诉我这个脚本有什么问题?
答案 0 :(得分:3)
在语句之间加上GO
。这样,每个语句的结果将在运行下一个语句之前提交(每个语句将是一个单独的事务)。
ALTER TABLE EPFieldSQLScripts
ADD fkRefTabNo int DEFAULT 1
GO
update EPFieldSQLScripts
set fkRefTabNo = 1
where fkRefTabNo is null
GO
ALTER TABLE EPFieldSQLScripts
ALTER COLUMN fkRefTabNo INTEGER NOT NULL
答案 1 :(得分:1)
正如其他人已经回答的那样,添加GO
是解决方案。这不是原因虽然
SQL Server正在尝试将整个脚本作为单个事务运行,然后仅在脚本完成时将数据提交到数据库。
update EPFieldSQLScripts
set fkRefTabNo = 1
where fkRefTabNo is null
运行(并且排队准备好提交),字段fkRefTabNo
实际上没有被添加到数据库表(仅在提交时发生)。添加GO
语句 - 或者单独运行每个语句 - 在继续下一个语句之前将事务提交到数据库,这就是为什么你会看到行为上的差异。
答案 2 :(得分:0)
尝试在每个语句之间添加GO
,结果应与单独执行每个语句相同。
答案 3 :(得分:0)
放在每个查询语句的末尾
喜欢
ALTER TABLE EPFieldSQLScripts ADD fkRefTabNo int DEFAULT 1;
update EPFieldSQLScripts set fkRefTabNo = 1 where fkRefTabNo is null;
ALTER TABLE EPFieldSQLScripts;
ALTER COLUMN fkRefTabNo INTEGER NOT NULL;
现在它必须一起工作。