Transact SQL - откат, переменная область, выход - PullRequest
0 голосов
/ 04 марта 2011

Несколько минимальная минимальная версия того, что я пытаюсь сделать, сводится к следующему:

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 происходит сбой:

Сообщение 207, Уровень 16, Состояние 1, Строка 0 Неверное имя столбца «СОЗДАН».

если я добавлю 'go' после ALTER TABLE, он будет работать, но завершится с ошибкой при последнем обновлении:

Сообщение 137, уровень 15, состояние 2, строка 7 Необходимо объявить скалярную переменную "@VERSION_TO".

Я понимаю, что область действия переменных ограничена операторами go. В любом случае, я хочу иметь только один в конце, поэтому изменения отменяются, если что-то пойдет не так И если ничего из этого невозможно, как я могу выйти из всего сценария, если есть ошибка, а не только транзакция?

Может кто-нибудь погуглить для меня, пожалуйста? :)

спасибо

1 Ответ

0 голосов
/ 04 марта 2011

Не можете ли вы просто переопределить @VERSION_TO и установить его после таблицы изменения DDL?ПРИМЕЧАНИЕ: транзакции и DDL не смешиваются, т.е. вы не можете откатить alter table.

Вы смотрели на sqsh?это SQL-оболочка для замены isql, которая может здесь сильно помочь.

...