1

我执行下面的代码:

use AdventureWorks2008R2
begin transaction
BEGIN
alter table HumanResources.Department add newcolumn int
update HumanResources.Department set newcolumn=1 where departmentid=1
END
commit

我得到的错误是:

列名“新列”无效。

语句可以ALTER包含在这样的事务中吗?如果是这样,我怎样才能防止这个错误?

我在网上对此进行了研究,例如这里。我还没有找到我的具体问题的答案。

4

3 回答 3

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是多余的)。

于 2013-08-12T20:36:48.257 回答
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;
于 2013-08-13T00:52:06.800 回答
0

亚伦已经解释了一切。另一种适用于 SSMS 中的 ad-hoc 脚本的替代方法是插入批处理分隔符GO,以便将脚本作为两部分发送到服务器。这仅在首先拆分脚本有效时才有效(IF例如,您不能拆分正文)。

于 2013-08-13T10:26:13.730 回答