方法一:
IF OBJECT_ID('tempdb..#MyTempTbl') IS NOT NULL
DROP TABLE #MyTempTbl;
方法二:
IF EXISTS (SELECT * FROM [tempdb].[sys].[objects]
WHERE [name] = N'#MyTempTbl')
DROP TABLE [#MyTempTbl];
检查和删除临时表的正确方法是什么?
上下文是由代理作业调用的存储过程。
我尝试查询 [tempdb].[sys].[objects] 并注意到全局临时表获得了相同的名称,而本地临时表获得的名称末尾带有下划线,例如 MyTempTbl______。所以我想知道是否有一种标准方法来检查临时表是否存在,如果存在则删除它,我正在寻找适用于本地和全局临时表的语法。
方法 1 的优点是实际工作正常。
方法 2 不适用于本地临时表,因为 中的条目
[tempdb].[sys].[objects]
具有内部系统生成的名称。它确实适用于全局临时表。您也可以使用DROP IF EXISTS,但在存储过程(和其他模块)中,这是不必要的,甚至可能有害。
在存储过程中,临时表会在过程结束时自动删除。
请注意(从缓存的角度来看)是否在过程结束时显式删除临时表并不重要。无论哪种方式,临时表仍然可以被缓存。
使用通用名称(例如
#MyTemp
模块中的本地临时表)通常不是一个好主意。使用特定于模块的内容来防止临时表名称是否会导致计划缓存膨胀中描述的问题?