更改事务中的语句

w00*_*977 1 sql t-sql sql-server transactions

我执行以下代码:

use AdventureWorks2008R2
begin transaction
BEGIN
alter table HumanResources.Department add newcolumn int
update HumanResources.Department set newcolumn=1 where departmentid=1
END
commit
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

列名称"newcolumn"无效.

可以ALTER在这样的交易中包含语句吗?如果是这样,我该如何防止此错误?

我在网上研究了这个,例如这里.我没有找到我的具体问题的答案.

Aar*_*and 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;
Run Code Online (Sandbox Code Playgroud)

请注意,缩进使代码块更容易识别(并且您的BEGIN/END多余).