2012-07-05 2 views
0

임시 테이블을 삭제하고 현재 @@ spid에 대해서만 임시 테이블을 제거하려면 어떻게해야합니까?현재 spid의 임시 테이블 삭제

IF EXISTS 
(
SELECT * 
FROM tempdb.dbo.sysobjects 
WHERE ID = OBJECT_ID(N'tempdb..#tmp') 
) 
BEGIN 
DROP TABLE #tmp 
END 

답변

3

로컬 #temp 테이블은 현재 SPID session_id에 대한 정의입니다 - 그래서 당신의 쿼리가 이미 요구하는지 않습니다. 이것은 조금 더 간단합니다.

IF OBJECT_ID(N'tempdb..#tmp', 'U') IS NOT NULL 
BEGIN 
    DROP TABLE #tmp; 
END 

그러나이 임시 테이블을 명시 적으로 삭제하는 이유는 무엇입니까? 파서가 동일한 배치에 같은 이름의 다른 파일을 만들 수는 없다는 것을 알고 있습니까?

+0

그 루프가 있습니다. 아이템의 마지막으로 알려진 가격을 찾고 고객에게이 제품이 'Co %'와 같은 철자로 표시된 상품의 마지막 가격임을 알립니다. 콜라, 코스트, 구리, 코발트, 옥수수. 따라서 콜라에 대한 정보를 수집 한 후이 중간 테이블을 삭제 한 다음 다시 새로 시작하십시오. 나는 그것을 썼을 때 논리적으로 보였습니다. 그러나 두세 명의 sprocs가 동시에 불을 켜면 임시 테이블을 삭제함으로써 두려웠습니다. – RetroCoder

+0

@RetroCoder 왜 매번 새로운 임시 테이블이 필요합니까? 왜 임시 테이블이 필요한거야? 실제 코드가 더 최적의 솔루션을 제공하는 데 도움이 될 것으로 생각됩니다. 당신이 묘사하고있는 것은 나에게 최적의 반대 인 것처럼 보입니다. –

+1

'CREATE PROCEDURE #tmp AS SELECT 1; '그런 다음 위의 코드를 실행하십시오. ' '#tmp'는 프로 시저이므로 '#tmp'와 함께 DROP TABLE을 사용할 수 없습니다. DROP PROCEDURE를 사용하십시오. Object_ID의 두 번째 매개 변수 'U'를 사용하십시오. – ErikE

2

로컬 tempdb 테이블 (예 : #tmp)은 현재 세션에서만 볼 수 있습니다.

다른 세션에서도 전역 tempdb 테이블 (예 : ##tmp)을 볼 수 있습니다.

접두어 # 하나만 사용하는 경우 임시 테이블은 세션에 로컬이됩니다.

자세한 내용은 article on SQL Server central을 참조하십시오.

+0

#tmp 테이블이 현재 세션에서 사용된다는 것을 알았지 만, 내가 깨닫지 못했던 것은 현재 세션에서만 해당 임시 테이블을 삭제할 수 있다는 것과 임시 테이블을 하나의 session_id에서 삭제할 수 없다는 것입니다. 다른 session_id. 잘 알고 있지만. – RetroCoder

+1

확인. 임시 테이블을 비우기 위해 항상 'tmp에서 삭제'를 사용할 수 있지만, 반드시 삭제할 필요는 없습니다. – Andomar

+2

@Andomar은 절대적으로 명확하게 나타 내기 위해 "삭제"가 아니라 "삭제"를 의미했습니다. 특히 객체 탐색기에서 테이블을 마우스 오른쪽 버튼으로 클릭하고 놓기 작업을 "삭제"라고 할 때부터 새로운 사용자를위한 명칭이 절대적으로 혼란 스럽습니다. 가능한 한 분리하여 삭제하고 삭제하는 것이 중요하다고 생각합니다. –