2016-09-22 2 views
1

난 그냥 다음 쿼리는 오류SQL 서버 2000 : 잘못된 열 이름 '바'

에게 메시지 (207)를 반환 2000

SQL Server의 이상한 버그, 수준 16, 상태 3을 찾은 것 같아요 , 7 호선
잘못된 열 이름 '바'

내가 SQL Server 2005에서 똑같은 쿼리를 실행하면 작동합니다. 그것은 내가 select #weirdness.* 일 때도 작동합니다. 프로 시저에서 사용할 수있는 몇 가지 해결 방법이 있습니까? go은 도움이되지만 프로 시저에서는 사용할 수 없습니다. BTW, 우리는 SQL Server 2000을 제거 할 것이지만 시간이 걸립니다.

select 1 as foo 
into #weirdness; 

alter table #weirdness add bar int identity; 

--select #weirdness.* --works 
select #weirdness.bar --fails 
from #weirdness; 

시스템 :

마이크로 소프트 SQL 서버 2000 - 8.00.2066 (인텔 X86) 7 월 2012 (11) 18시 41분 14초
저작권 (C) Windows에서 1988-2003 마이크로 소프트 표준 버전 NT 5.2 (빌드 3790 : 서비스 팩 2)

답변

1

다음은 여기에 대한 해결책입니다.

가능한 경우 SQL Server 2005 이상을 사용하십시오.

가능 분할하면 여러 배치에 스크립트 (절차에서 불가능) :

select 1 as foo 
into #weirdness; 

alter table #weirdness add bar int identity; 

go --split into multiple batches 

--select #weirdness.* --works 
select #weirdness.bar --fails 
from #weirdness; 

먼저 테이블을 만듭니다

create table #weirdness (
    foo bit 
, bar int identity 
); 

insert into #weirdness(foo) 
select 1 as foo; 

select #weirdness.bar 
from #weirdness; 
1

이것은 버그가 아닙니다, 문서화 된 동작입니다. 크기에이를에보십시오 : 당신이 "바"존재하지 않는다고 불평뿐만 아니라 SQL Server 2005에서 실패하는 것을 볼 수 있습니다

select 1 as foo into #weirdness; 
go 
alter table #weirdness add bar int; 
select #weirdness.bar 
from #weirdness; 

.

왜 실패합니까? the documentation 당, 당신이 그렇게하도록 허용하지 않는, 때문에 :

테이블은 다음 같은 배치에서 참조하는 새 열을 변경 할 수 없습니다.

그렇다면 SQL Server 2005에서는 하나의 일괄 처리 만 수행하고 SQL Server 2000에서는 수행하지 않으면 왜 테이블을 만들고 변경 한 다음 참조 할 수 있습니까? 이는 위에서 설명한 문 재 컴파일과 관련이 있으며 2005 년에 새로 추가되었습니다.

SQL Server 2005에서 #weirdness은 일괄 처리의 시작 부분에 없기 때문에 SQL Server는 그것을 참조하는 문장. select .. into이 실행되고 해당 참조 문을 다시 컴파일해야합니다. 그런 다음이 명령문은 하나씩 컴파일되고 실행됩니다. 우리가 #weirdness.bar을 참조 할 즈음에, 그것은 생성되었고 컴파일은 성공적이다.

SQL Server 2000에서 #weirdness은 일괄 처리의 시작 부분에 없기 때문에 SQL Server는이 인스턴스를 참조하는 문을 컴파일하지 않습니다. select .. into이 실행되고 전체 일괄 처리가 다시 컴파일하도록 표시됩니다. 그러나 alter table이 실행되지 않고 일괄 처리가 중지되기 때문에 select #weirdness.bar 컴파일이 실패합니다.

따라서 문서는 실제로 "일괄 처리가 시작될 때 테이블이 전혀 존재하지 않는 한, 테이블을 변경할 수 없으며 동일한 일괄 처리에서 참조 된 새 열을 읽어야합니다. 그런 다음이 물건으로 도망 갈 수 있습니다 SQL Server 2005 이후부터, 그러나 그것에 의존하는 것은 그다지 뜨거운 아이디어가 아닙니다. " 왜 그들이 더 단순하게 유지하는지 알 수 있습니다.