我想要做的事情的最小版本归结为:
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语句的限制。无论如何,我只想在最后有一个,所以如果出现任何问题,我们会回滚更改。如果这一切都不可能,如果出现错误,我怎么能退出整个脚本呢?不仅仅是交易?
是的,有人能为我解答答案吗? :)谢谢
答案 0 :(得分:0)
你能不能重新定义@VERSION_TO并在你的alter table DDL之后设置它?
注意:事务和DDL不会混合,即您无法回滚alter table
。
你看过sqsh吗?它是一个替换isql的SQL“shell”,可以在这里提供很多帮助。