我执行以下代码:
use AdventureWorks2008R2
begin transaction
BEGIN
alter table HumanResources.Department add newcolumn int
update HumanResources.Department set newcolumn=1 where departmentid=1
END
commit
我得到的错误是:
列名称无效' newcolumn'。
ALTER
语句可以包含在这样的交易中吗?如果是这样,我该如何防止此错误?
我在网上对此e.g. here进行了研究。我没有找到我的具体问题的答案。
答案 0 :(得分:9)
是的,您可以在交易中加入ALTER
。问题是解析器验证了UPDATE
语句的语法,并且无法“看到”您还在执行ALTER
。一种解决方法是使用动态SQL,以便解析器不会检查您的语法(并验证列名称),直到ALTER
已经发生的运行时:
BEGIN TRANSACTION;
ALTER TABLE HumanResources.Department ADD newcolumn INT;
EXEC sp_executesql N'UPDATE HumanResources.Department
SET newcolumn = 1 WHERE DepartmentID = 1;';
COMMIT TRANSACTION;
请注意,缩进使代码块更容易识别(并且BEGIN/END
是多余的)。
答案 1 :(得分:0)
如果你检查列的存在,那么它应该工作。
BEGIN TRANSACTION;
IF COL_LENGTH('table_name', 'newcolumn') IS NULL
BEGIN
ALTER TABLE table_name ADD newcolumn INT;
END
EXEC sp_executesql N'UPDATE table_name
SET newcolumn = 1 WHERE DepartmentID = 1;';
COMMIT TRANSACTION;
答案 2 :(得分:0)
亚伦已经解释了一切。另一种适用于SSMS中的临时脚本的替代方法是插入批处理分隔符GO
,以便将脚本作为两个部分发送到服务器。这仅在首先拆分脚本有效时才有效(例如,您无法拆分IF
正文)。