2011-03-04 2 views
0

내가 할 노력하고있어의 다소 최소한의 최소한의 버전을 종료 롤백, 가변 범위는,이 아래로 비등 :거래 SQL

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 표 후 업데이트에 실패

메시지 레벨 16, 상태 1, 줄 0 'CREATED'잘못된 열 이름입니다.

내가 넣어 경우는 마지막 UPDATE에 작동하지만, 실패,은 ALTER TABLE 후 '이동' 는 스칼라를 선언해야합니다

메시지 137, 수준 15, 상태 2, 7 호선 변수 "@VERSION_TO".

변수의 범위는 go 문으로 제한됩니다. 어쨌든, 결국에는 하나만 갖고 싶기 때문에 어떤 것이 잘못되면 변경 사항이 롤백됩니다. 그리고 이것이 가능하지 않다면 트랜잭션뿐 아니라 오류가있는 경우 어떻게 전체 스크립트를 종료 할 수 있습니까?

누구나 나를 Google의 대답으로 알려줄 수 있습니까? :)

감사

+0

위법성이 없지만 Google에서 대답을 찾을 수 없었습니까? – Simon

+0

나는 너무나 좌절감을 나타 냈기 때문에 나는 냉소적이었다. 나는 대답을 찾지 못했다. :) – user644342

답변

0

당신은 단지 @VERSION_TO를 재정의하고 테이블 변경 DDL 후를 설정할 수 있습니까? 참고 : 거래와 DDL이 섞이지 않습니다. 즉 alter table을 롤백 할 수 없습니다.

sqsh를 보았습니까? 여기에 많은 도움이 될 isql을 대체 할 SQL "쉘"입니다.

+0

글쎄, 나는 할 수 있었지만, 스크립트는 훨씬 더 크고 더 많은 변수가있다. 변수 범위를 확장 할 수있는 방법이 있습니까? – user644342