2016-09-20 3 views
0

테이블에 새 열을 추가 한 다음 기존 열을 기반으로 해당 열을 업데이트하는 스크립트를 실행해야합니다.테이블 변경 스크립트가 추가하려고하는 것을 볼 수 없어 실패했습니다

PRINT 'Adding Column to Table...' 

ALTER TABLE dbo.Table 
ADD [Column] DATETIME2 NULL; 

PRINT 'Updating data...' 
UPDATE dbo.Table 
SET [column] = ISNULL([ModifiedDate],[CreatedDate]) 

PRINT 'Finalising table structure...' 
ALTER TABLE dbo.Table 
ALTER COLUMN [Column] DATETIME2 NOT NULL 

PRINT 'Complete!' 

그러나 한 번에 실행하면 업데이트에 '열'이 없다는 오류가 발생합니다.

한 번에 한 줄씩 실행하면 작동합니다.

이 문제를 해결할 방법이 있습니까?

업데이트를 수행하기 위해 EXEC를 사용하여 이것을 우회 할 수 있지만 이는 해킹이 될 수 있습니다. 그것은 유일한 옵션입니까?

답변

2

UPDATE을 컴파일 할 때 열을 알 수없는 문제가 있습니다. 다른 명령 사이에 GO을 삽입하여 문제를 해결할 수 있다고 생각합니다.

하지만, 단지 계산 된 열 사용하지 이유 : 계산 된 열을 통해

ALTER TABLE dbo.Table ADD [Column] AS COALESCE([ModifiedDate],[CreatedDate]) ; 

을, 당신은 업데이 트를 수행 할 필요가 없습니다, 그리고 값은 항상 올바른 것입니다.

+0

좋은 생각이들 것입니다. 문제는 변경이 버그 때문입니다. ModifiedDate 및 CreatedDate는 감사 필드이며 응용 프로그램에서 사용하기위한 것이 아니므로 별도의 '비즈니스 값'열이 필요합니다. – Craig

0

나 또한 그렇게 @Gordon 말한대로 생각, 당신은 아래의 문장 사이에 GO를 사용하여 문제를 제거 할 수 :

PRINT 'Adding Column to Table...' 

ALTER TABLE dbo.[Table] ADD [Column] DATETIME2 NULL; 

GO 

PRINT 'Updating data...' 
UPDATE dbo.[Table] 
SET [column] = ISNULL([ModifiedDate],[CreatedDate]) 

GO 

PRINT 'Finalising table structure...' 
ALTER TABLE dbo.[Table] 
ALTER COLUMN [Column] DATETIME2 NOT NULL 

PRINT 'Complete!' 

는이 코드를 시도하십시오 수 있습니다. 테이블 이름을 대괄호로 묶었습니다. 예약 키워드이므로 SQL2012에서 실행할 수 없으며 GO없이 끝까지 작업하고있었습니다.