2013-03-07 7 views
0

SQL 쿼리에 매우 이상한 문제가 있습니다.매우 이상한 SQL Server 쿼리 동작

IF NOT EXISTS ([special query here]) 
    BEGIN 
     SELECT 1; 
    END 
ELSE 
    BEGIN 
     SELECT 2; 
    END 

출력 상기 질의 2.

그러나 I 테이블 등 복수의 에러가 발생된다를 만들 함유 큰 조회로 SELECT 1; 부분을 대체. 어떻게 그 케이스가 사실이 아닌 동안 IF 진술의 경우에 SQL Server가 코드를 실행할 수 있습니까?

+1

IF에 무엇이 있는지 확인합니다. – HLGEM

+1

"큰 쿼리"에서 문제가 발생했을 수 있습니다. 그것을 공유하는 신경? – Kermit

+1

스크립트에서 테이블 스키마를 전혀 변경하지 않습니까? 질문에 대한 자세한 내용이 필요합니다. – jTC

답변

0

스키마를 변경하는 경우 파서는 스키마를 실행하기 전에 모든 엔터티가 있는지 확인합니다.

ALTER TABLE myTable ADD aNewColumn INT 

UPDATE myTable SET aNewColumn = 0 

그러면 오류가 발생합니다.

클라이언트에서 매개 변수를 가져 오지 않는 한 동적 SQL을 사용할 수 있습니다.

EXEC sp_executesql N'UPDATE myTable SET aNewColumn = 0' 
+0

사용자 입력을하지 않는 한'SQL INJECTION' 취약점이 없어야합니다. – jTC

0

구문 오류는 실행중인 조건부 분기 또는 실행되지 않는 조건부 분기에 관계없이 구문 오류입니다. 구문 분석은 실행 전에 수행되며 이어야합니다. 프로그램의 의도 된 의미가 결정 할 수 없기 때문에,

int main() 
{ 
    if (false) { 
     acbukasygdfukasygdaskuygdfas#@4r9837y214r 
    } 
} 

당신은 그것을 실행하지 않을거야 블록의 내부에 비록 그 말도 라인을 쓸 수 없습니다 :

는 C++로 작성된이 유사한 예를 살펴 컴파일러.

+0

Intellisense를 제공함에 따라 SQL Management Studio에서 컴파일 오류를 알릴 것으로 예상됩니다. – ReFocus