Transact SQL - 回滚,可变范围,退出

时间:2011-03-04 08:34:43

标签: sql transactions scope

我想要做的事情的最小版本归结为:

declare @VERSION_TO NVARCHAR(255); 
declare @VERSION_CURRENT NVARCHAR(255); 
set @VERSION_TO = '3.0.4401';

select @VERSION_CURRENT = VERSION from T_SYSTEM_INFO;

print 'target version:      ' + @VERSION_TO
print 'current version:    ' + @VERSION_CURRENT
if not @VERSION_CURRENT IN ('3.0.4300')
begin
     raiserror( 'Patch not possible - unknown predecessor "%s"', 17, 10, @VERSION_CURRENT)
     return
end

alter table T_JOB add CREATED [datetime];
update T_JOB set CREATED = (select top 1 STEP_START from T_JOB_STEP where T_JOB_STEP.JOB = T_JOB.ID and T_JOB_STEP.ID not in (select STEP from T_JOB_STEP_DEPENDENCY));
update T_JOB set CREATED = '01-01-2000' where T_JOB.CREATED is null;
alter table T_JOB alter column CREATED [datetime] not null;
update T_SYSTEM_INFO set VERSION = @VERSION_TO; 

go

但在第一个ALTER TABLE之后更新失败:

  

Msg 207,Level 16,State 1,Line 0     列名称'CREATED'无效。

如果我在ALTER TABLE之后放置'go',它可以工作,但在最后一次UPDATE失败:

  

Msg 137,Level 15,State 2,Line 7     必须声明标量变量“@VERSION_TO”。

我理解变量的范围受go语句的限制。无论如何,我只想在最后有一个,所以如果出现任何问题,我们会回滚更改。如果这一切都不可能,如果出现错误,我怎么能退出整个脚本呢?不仅仅是交易?

是的,有人能为我解答答案吗? :)

谢谢

1 个答案:

答案 0 :(得分:0)

你能不能重新定义@VERSION_TO并在你的alter table DDL之后设置它? 注意:事务和DDL不会混合,即您无法回滚alter table

你看过sqsh吗?它是一个替换isql的SQL“shell”,可以在这里提供很多帮助。