2012-07-09 2 views
1

SQL Server 2005 데이터베이스를 사용하고 있는데 begin ... end 블록에서 수행 할 작업에 따라 동일한 데이터 집합에 대해 서로 다른 두 가지 방식으로 동작하는 If 문이 있습니다. 나는 단지, 콘솔, 다음 코드를 인쇄 아무것도 인쇄 할 경우Insert 문은 항상 앞의 IF 문 결과에 관계없이 항상 실행됩니까?

은 먼저, 예상대로이 코드 인쇄 '컨트롤 발견'

if (not exists(select null from tblControls where Name = 'SOME_CONTROL_NAME')) 
begin 
    print 'control not found' 
end 

반면 예상대로 :

if (exists(select null from tblControls where Name = 'SOME_CONTROL_NAME')) 
begin 
    print 'control found' 
end 

그러나 코드를 다음과 같이 변경하면 :

if (not exists(select null from tblControls where Name = 'SOME_CONTROL_NAME')) 
begin 
    insert into tblControls values (632, 'NEW_CONTROL_NAME', 'New Control', 1, 1, NULL, 1, 'DataControls.CheckBox', NULL, NULL, 1) 
end 

삽입 문은 항상 실행됩니다. tblControls에 일치하는 레코드가 있지만 이 동작을 일으킬 수있는 T-SQL 2005의 insert 문에 특별한 것이 있습니까? 아니면 확실하지 않은 부분이 있습니까? 나는 코드의 논리가 잘못되었는지 이해 하겠지만 print 문을 사용하여 테스트했을 때 예상대로 작동합니다.

EDIT : "Insert Error"메시지가 생성됩니다.

이 실망한 문제에 대한 도움을 주시면 감사하겠습니다.

답변

2

Exists ...에서 NULL입니다. 선택하면 혼란 스럽습니다. 종료 /는 괄호없이 쓸 수있다, 또한

if (not exists(select * from tblControls where Name = 'SOME_CONTROL_NAME')) 
begin 
    insert into tblControls values (632, 'NEW_CONTROL_NAME', 'New Control', 1, 1, NULL, 1, 'DataControls.CheckBox', NULL, NULL, 1) 
end 

및 시작 : 시도

내가 생각을 제일 먼저입니다
IF NOT EXISTS (SELECT * FROM tblControls WHERE Name = 'SOME_CONTROL_NAME') 
    INSERT INTO tblControls VALUES (632, 'NEW_CONTROL_NAME', 'New Control', 1, 1, NULL, 1, 'DataControls.CheckBox', NULL, NULL, 1) 
+0

너무! 불행히도, 나는 *로 변경하려고했지만 아무 것도 해결하지 못했습니다. 또한 인쇄 명령문이 예상대로 작동한다는 사실은 저에게 다른 것을 알려줍니다. begin ... end는 if 문에 대한 코딩 표준의 일부이므로 제거 할 수 없습니다. –

+0

@WilliamSmith - SELECT * FROM tblControls WHERE Name = 'SOME_CONTROL_NAME'' 문을 실행하면 어떤 결과가 나타 납니까? –

+1

@WilliamSmith, 두 번째 솔루션 (시작/끝)을 사용해보십시오. 나는 항상 그것을 사용하고 결코 실패한 적이 없다. 또한 INSERT 문의 VALUE 수는 tblControls의 (비 Identity) 열 수와 같습니까? –

관련 문제