[英]SQL Dropping temp tables [closed]
在存储过程中删除表是一种更好的做法?
样品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
您正在处理本地临时表。 你不需要这么担心。
存储过程在返回时自动删除临时表,因此您不必担心临时表会延迟。 我花了一段时间来习惯这种行为,但因为这种行为被记录在案 ,你可以依靠它:
- 存储过程完成时,将自动删除在存储过程中创建的本地临时表。
这是本地声明的临时表在SQL Server中的工作方式。 这只是他们定义的语义。
当然,您可能会担心在存储过程外创建的临时表。 但大肆丢弃这样的表可能是危险的。
在多次调用存储过程时,您不必担心命名冲突:
如果在可由多个用户同时执行的存储过程或应用程序中创建本地临时表,则数据库引擎必须能够区分由不同用户创建的表。 数据库引擎通过在每个本地临时表名称内部附加数字后缀来完成此操作。
这一切都有一些细微差别。 因为临时表使用公共名称空间来表示约束名称,所以如果添加自己的名称,则需要小心。
在不再需要临时表时删除临时表没有任何问题。 我只是指出这不是必要的。
作为优先选择,我更喜欢表变量而不是临时表。 更清楚的是,它们的范围在存储过程中,与其他变量相同。
我会推荐两者。 我之前在同一个过程中编码过,没有人抱怨冗余代码或不遵循DRY。 使用表完成proc时,最好不要使用它,因此它不使用资源。 特别是如果会话由于某种原因保持打开状态,该表将持续到会话结束或直到您放弃该表。
如果选择1,请使用第一个选项。 如果在您的表中引入奇怪的数据并且您从函数中抛出异常,则代码可能无法进入drop部分。 然后,如果同一会话再次运行proc,则boom,object已经存在。 无论proc何时执行,存在检查都将删除临时表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.