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