2014-08-30 3 views
4

방아쇠를 여러 번 호출 할 수 있기 때문에 확실한 임시 테이블 #attributeType이 있는지 확인하고 싶습니다.# temp 테이블 (#attributeType)을 처리하는 Trigger를 만들고 있습니다. #temporary 테이블이 있는지 여부를 확인할 수 없습니다. else 문이있는 경우

이것은 임시 테이블을 검사 트리거 본문 내 코드입니다 : 나는 F5로를 선택하여 코드를 테스트 할 때

IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL 
    BEGIN 
     DROP TABLE #attributeType 
     SELECT * INTO #attributeType 
     FROM attributeType 
     PRINT 'IN IF'+ CAST(OBJECT_ID('tempdb..#attributeType') AS NVARCHAR(80)) 
    END 
ELSE 
    BEGIN 
     SELECT * INTO #attributeType 
     FROM attributeType 
     PRINT 'IN ELSE'+ CAST(OBJECT_ID('tempdb..#attributeType') AS NVARCHAR(80)) 
    END 

은 내가 #attributeType 임시 테이블이 존재한다는,이 오류 메시지가 :

Msg 2714, Level 16, State 1, Line 11 
There is already an object named '#attributeType' in the database. 

내가 저장 프로 시저에 #tempTables가 SP 종료 즉시 삭제됩니다 알고 있지만, 내 코드가 잘못 왜 아직도 내가 이해할 수 없다?

N.B. ELSE 블록을 주석 처리하면 코드가 작동합니다.

답변

10

OBJECT_ID('tempdb..#attributeType')에 대한 테스트가 정상적으로 작동합니다. 같은 배치에 dropcreate없이 별도로 실행하여 테스트 할 수 있습니다.

문제는 SQL Server가 실행하기 전에 전체 배치를 구문 분석한다는 것입니다. 이전 행의 테이블을 삭제하더라도

SELECT * INTO #attributeType 

: 그것은 #attributeType의 존재를 알고 있다면 그것은에 대한 오류를 줄 것이다.

한 가지 해결책은 다른 배치에 테이블을 삭제하는 것입니다

또 다른 방법은 다른 범위에서 테이블을 만드는 것입니다

IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL 
    DROP TABLE #attributeType 
GO -- new batch 
SELECT * INTO #attributeType ... 
:

IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL 
    DROP TABLE #attributeType 
exec ('SELECT * INTO #attributeType ...') 
+0

@ Andomar-이 구문 분석 문제는 일종의 버그입니까? – Luther

+0

버그가 아니며 원시 수준에 불과합니다. – Andomar

+0

GO 본체를 트리거 본체에 배치하면 GO 문 앞에 선언 된 변수가 새 배치에서 보이지 않습니다. 내가 어떻게 이걸 처리해야하는지 생각 해봐. 첫 번째 명령문으로 If 절을 넣고 트리거 본문에서 GO를 수행 한 다음 모든 변수와 나머지 코드를 선언하면 트리거가 두 배치로 분할되어 실패합니다. – Luther

0

수행 할 필요가없는 경우 IF..ELSE 문에서 다른 연산을 수행하면 코드가 다음과 같이 단순화 될 수 있습니다.

IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL 
BEGIN 
    DROP TABLE #attributeType 
END 

SELECT * 
INTO #attributeType 
FROM attributeType 

그의 경우에 There is already an object named... 오류가 발생하지 않으며 임시 테이블이 여전히 있습니다.