更改事务中的语句

时间:2013-08-12 20:15:13

标签: sql sql-server tsql transactions

我执行以下代码:

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进行了研究。我没有找到我的具体问题的答案。

3 个答案:

答案 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正文)。