在存储过程中删除表是一种更好的做法吗?
示例A
IF OBJECT_ID('tempdb..#tTable1') IS NOT NULL
DROP TABLE #tTable1
CREATE TABLE #tTable1
或 示例B
CREATE TABLE #tTable1
select * from #tTable1
Drop TABLE #tTable1
答案 0 :(得分:5)
您正在处理本地临时表。你不需要那么担心。
存储过程在返回时会自动删除临时表,因此您无需担心临时表会延迟。我花了一段时间才习惯这种行为,但由于这种行为是documented,你可以依赖它:
- 删除在存储过程中创建的本地临时表 存储过程完成后自动完成。
这是本地声明的临时表在SQL Server中的工作方式。这只是他们定义的语义。
当然,您可能会担心在外部存储过程创建的临时表。但大肆抛弃这些赌桌可能很危险。
当多次调用存储过程时,您不必担心命名冲突:
如果在存储过程中创建了本地临时表,或者 可以由多个用户同时执行的应用程序, 数据库引擎必须能够区分由其创建的表 不同的用户。数据库引擎在内部完成此操作 将数字后缀附加到每个本地临时表名。
这一切都有一些细微差别。因为临时表使用公共名称空间来表示约束名称,所以如果添加自己的名称,则需要小心。
在不再需要临时表时删除临时表没有任何问题。我只是指出这不是必要的。
作为优先选择,我更喜欢表变量而不是临时表。更清楚的是,它们的范围在存储过程中,与其他变量的方式相同。
答案 1 :(得分:3)
我会推荐两者。我之前在同一个过程中编码过,没有人抱怨冗余代码或不遵循DRY。使用表完成proc时,最好不要使用它,因此它不使用资源。特别是如果会话由于某种原因保持打开状态,该表将持续到会话结束或直到您放弃该表。
如果选择1,请使用第一个选项。如果在您的表中引入奇怪的数据并且您从函数中抛出异常,则代码可能无法进入drop部分。然后,如果同一会话再次运行proc,则boom,object已经存在。无论proc何时执行,存在检查都将删除临时表。