2012-07-05 75 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

它在一個while循環中,我正在搜索一個項目的最後一個已知價格,並告訴客戶,嘿是這是類似'拼寫%'類似拼寫項目的最後已知價格。可樂,海岸,銅,鈷,玉米。因此,在收集有關可口可樂的信息後,我放下這張中間餐桌,然後重新開始。看起來合乎邏輯,當我寫它時,但我擔心如果兩個或三個Sprocs在同時引發奇怪的副作用時同時觸發,刪除臨時表。 – RetroCoder 2012-07-05 21:51:26

+0

@RetroCoder爲什麼你每次需要一個新的臨時表?爲什麼你需要臨時表?我想看到實際的代碼可能有助於提供更優化的解決方案。你所描述的看起來與我最爲相反。 – 2012-07-05 21:59:37

+1

'CREATE PROCEDURE #tmp AS SELECT 1;'然後運行你的上面的代碼。 '不能使用DROP TABLE和'#tmp',因爲'#tmp'是一個過程。使用DROP PROCEDURE.'使用Object_ID的第二個參數'U'。 – ErikE 2012-07-05 22:43:58

2

本地tempdb表(如#tmp)僅對當前會話可見。

全局tempdb表(如##tmp)在其他會話中也可見。

只要您僅使用一個#前綴,您的臨時表將在您的會話中是本地的。

欲瞭解更多信息,請參閱此article on SQL Server central

+0

我意識到在當前會話中使用#tmp表,但我沒有意識到的是,我只能在當前會話中刪除該臨時表,並且不可能在一個session_id中將其刪除臨時表另一個session_id。雖然很高興知道。 – RetroCoder 2012-07-05 21:59:11

+1

好的。您總是可以使用從#tmp中刪除來清空臨時表,但並不總是需要刪除它。 – Andomar 2012-07-05 22:03:51

+2

@Andomar只是非常清楚,你的意思是「放棄它」而不是「刪除它」。我發現這個命名法對於新用戶來說絕對是令人困惑的,特別是當你在對象資源管理器中右鍵單擊一個表並且該放置操作被稱爲「刪除」時。我認爲儘量保持刪除和刪除是非常重要的。 – 2012-07-05 22:54:30