方法1:
IF OBJECT_ID('tempdb..#MyTempTbl') IS NOT NULL
DROP TABLE #MyTempTbl;
办法2:
IF EXISTS (SELECT * FROM [tempdb].[sys].[objects]
WHERE [name] = N'#MyTempTbl')
DROP TABLE [#MyTempTbl];
检查和删除临时表的正确方法是什么?
上下文是由代理作业调用的存储过程。
我已经尝试过查询诱饵.系统.对象,并注意到全局临时表的名称与本地临时表相同,其中本地临时表的名称在末尾带有下划线,如这个MyTempTbl______。因此,我想知道是否有一种标准的方法来检查临时表是否存在,如果是的话,我正在寻找适用于本地和全局临时表的语法。
发布于 2023-01-31 22:17:11
方法1具有实际正确工作的优点。
方法2不适用于本地临时表,因为[tempdb].[sys].[objects]
中的条目具有内部系统生成的名称。它确实适用于全局临时表。
您也可以使用如果存在下降,但是在存储过程(和其他模块)中,它是不必要的,甚至是潜在有害。
在存储过程中,临时表将自动删除在过程的末尾。
存储过程中的临时表的...an显式删除是不必要的,因此不建议.
注意,是否显式地在过程末尾删除临时表(来自缓存透视图)并不重要。无论哪种方式,临时表仍然可以缓存。
通常,对模块中的本地临时表使用像#MyTemp
这样的通用名称并不是一个好主意。使用特定于模块的内容来防止临时表名会导致计划缓存膨胀吗?中描述的问题
https://dba.stackexchange.com/questions/322841
复制