2012-04-22 4 views
15

:문제 그것은 다음과 같은 SQL을 감안할 때

메시지 207, 수준 16, 상태 1, 줄 10 잘못된 열 이름 '

IF EXISTS (SELECT * FROM sys.columns WHERE name = 'NewFieldName' AND object_id = OBJECT_ID('dbo.MyTableName')) 
    RETURN 

-- Add NewFieldName column to part of the Summer 2012 release cycle. 
ALTER TABLE dbo.[MyTableName] ADD 
    [NewFieldName] SmallINT NOT NULL 
     CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = 'FindMe' --Update one specific value 

다음과 같은 오류 메시지를 생성합니다 NewFieldName '.

나는 기본적인 것이 빠졌지 만, 변경된 후에 "GO"를 넣으려고하면 매번 업데이트가 실행되고 나는 그것을하고 싶지 않습니다.

이 문을 구조화하여 열이 있는지 여부를 확인하고 추가하지 않으면 내 UPDATE 문에 명시된대로 값을 설정할 수 있습니까?

+0

첫 번째 업데이트 문이 중복되면 'default (2)'로 모든 레코드를 2로 설정합니다. –

+0

위의 내용이 저에게 효과적입니다. 어떻게 그걸 집행하니? 'NewFieldName' 열이 생성 되었습니까? –

+0

@AmirIsmail이 잘못되었습니다. ALTER 문을 실행하면 필드가 생성되지만 기존 레코드에는 기본값이 설정되지 않습니다. 어쩌면 그것을하기 위해 ALTER를 작성하는 다른 방법이있을 수 있습니다. 현재 구조는 기존 행에 대한 기본값을 설정하지 않습니다. – ray

답변

17

새 열을 추가 한 후 컴파일 할 새 열을 참조하는 문이 필요합니다. 이 작업을 수행하는 한 가지 방법은 EXEC을 사용하여 하위 배치로 실행하는 것입니다. 배치는 따라서 테이블을 참조 그것의 모든 문이 연기 컴파일 될 수 있습니다 것을 의미 컴파일 할 때 테이블 자체가 존재하지 않았기 때문에

IF NOT EXISTS (SELECT * 
       FROM sys.columns 
       WHERE name = 'NewFieldName' 
         AND object_id = OBJECT_ID('dbo.MyTableName')) 
BEGIN 
    -- Add NewFieldName column to part of the Summer 2012 release cycle. 
    ALTER TABLE dbo.[MyTableName] 
      ADD [NewFieldName] SMALLINT NOT NULL 
      CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

    EXEC(' UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = ''FindMe''') 
END 

당신을 위해 일한 이유는 원래 생각된다.

관련 문제