2010-04-15 3 views
5

임시 테이블을 생성하고 임시 테이블에 대량 삽입을 수행 한 다음 테이블을 삭제하기 전에 일부 SQL을 실행하는 클라이언트 응용 프로그램이 있습니다.DROP TABLE이 임시 테이블에 대해 실패합니다.

의사 코드 :이 DROP 문에 대한 오류와 함께 실패

open connection 
begin transaction 
CREATE TABLE #Temp ([Id] int NOT NULL) 
bulk insert 500 rows into #Temp 
UPDATE [OtherTable] SET [Status]=0 WHERE [Id] IN (SELECT [Id] FROM #Temp) AND [Group]=1 
DELETE FROM #Temp WHERE [Id] IN (SELECT [Id] FROM [OtherTable] WHERE [Group]=1) 
INSERT INTO [OtherTable] ([Group], [Id]) SELECT 1 as [Group], [DocIden] FROM #Temp 

DROP TABLE #Temp 
COMMIT TRANSACTION 
CLOSE CONNECTION 

:

가 존재하지 않거나 권한이 없으므로 테이블 '#Temp'을 (를) 삭제할 수 없습니다 .

이 오류가 다른 일이 발생하지 않고 어떻게 발생할 수 있는지 상상할 수 없지만 그 전에는 다른 오류가 발생하지 않습니다.

이 문제가 발생할 수있는 것이 누락 되었습니까?

+0

제안을 말한다 어디 어디 작성, 대량 삽입을 이동하고, 테이블의 이름을 입력하고 트랜잭션 블록 외부에서 문을 들러주세요. 다른 연결이 액세스 할 수 없으므로 잠글 필요가 없으며 필요가 없습니다. –

+0

@Philip Kelley : 그건 나쁜 생각이 아니에요. 트랜잭션의 길이를 제한하기 위해 그렇게 할 수 있는지 알아볼 것입니다.하지만이 문제가 어떻게 발생하는지 알 수 없습니다. – StarBright

+0

버그가 공백에 나타납니다. . ;) 완전한 복제 스크립트는 이것에 대해 더 많은 것을 밝힙니다. – Aaronaught

답변

5

중간에 세션에서 문제가 발생했을 가능성이 있습니까? 이 떨어되기 전에 테이블의 존재 여부를 확인

시도 :

IF object_id('tempdb..#Temp') is not null 
BEGIN 
    DROP TABLE #Temp 
END 
+0

테이블이 실제로 사라 졌는지 확인하려고 일부 도구를 추가하고 있지만, 그 동안에는이 문제의 원인이 될 수있는 사항을 볼 수 없습니다. 내가 설명한 것과 다른 문장에서 오류가 발생하지 않는 세션에서 SQL이 발생하지 않습니다. – StarBright

2

나는 당신이 문 때문에

CREATE TABLE #Temp ([Id] AS int) 

가 잘못된, 모든 테이블을 생성하지 않는 생각합니다.

CREATE TABLE #Temp ([Id] int) 

으로 작성하고 작동하는지 확인하십시오.

+0

혼란에 빠져서 무고한 사람을 보호하기 위해 테이블 ​​이름을 변경하고 잘못 입력했습니다 ... 실제 테이블 정의가 의미 상으로 정확하다면, 질문을 – StarBright

6

나는 SQL 서버 2005이 테스트 한, 당신은 그것을 만든 트랜잭션에서 임시 테이블을 삭제할 수 있습니다 :

begin transaction 
create table #temp (id int) 
drop table #temp 
commit transaction 

사용하는 SQL 서버의 버전?

왜 임시 테이블을 삭제할 것인지 다시 생각해보십시오. 로컬 임시 테이블은 연결이 끝나면 자동으로 삭제됩니다. 일반적으로 명시 적으로 삭제할 필요는 없습니다.

글로벌 임시 테이블은 이중 해시로 시작합니다 (fx. ##MyTable). 그러나 연결이없는 경우 전역 임시 테이블도 자동으로 삭제됩니다.

+2

+1으로 업데이트 할 것입니다. "왜 임시 테이블을 드롭해야합니까?" –

2
BEGIN TRAN 

IF object_id('DATABASE_NAME..#TABLE_NAME') is not null 
BEGIN 
    DROP TABLE #TABLE_NAME 
END 

COMMIT TRAN 

참고 : TABLE_NAME 및 데이터베이스 이름이 DATABASE_NAME