我有一个存储过程,用于创建临时表。它只需要存储过程的范围,而不需要其他地方。
当我使用临时表列出这个时,我总是检查临时表是否存在,如果存在则删除它,然后在存储过程中创建它。即:
IF OBJECT_ID('tempdb..#task_role_order') IS NOT NULL
DROP TABLE #task_role_order
CREATE TABLE #task_role_order(...)
大多数情况下,除了在创建临时表之前,删除临时表是最佳做法吗?
如果需要更多上下文,我有一个.NET Web API后端,它调用数据库中的存储过程。我相信当SQL Server会话结束时,SQL Server会丢弃临时表。但我不知道.NET每次查询数据库时是打开一个新的SQL Server会话,还是每个应用程序生命周期只打开一次等等。
我已经阅读了similar question,但认为情况略有不同。
答案 0 :(得分:6)
通常,只要您不再需要资源,就可以将资源释放出来。所以我会在存储过程结束时添加DROP TABLE。
只要连接存在,临时表就会存在。通常,应用程序使用连接池(可配置),并且在调用Connection.Close时连接不会关闭。在连接重新使用之前,客户端执行特殊的存储过程(sp_reset_connection),它执行所有清理任务。因此,临时表将在任何情况下被删除,但有时会延迟一段时间。
答案 1 :(得分:1)
它不太可能产生太大影响,但如果我不得不选择,我就不会这样做。临时表可以通过嵌套的存储过程访问,因此除非您特别需要在过程之间传递数据,否则如果您碰巧使用相同的名称,则不执行任何操作将有助于避免争用,以循环方式递归调用过程(并且是有效的,或者你有另一个碰巧使用相同名称和列的过程。将其从实践中删除可能会隐藏一些奇怪的逻辑错误。
例如,Proc A创建临时表,然后调用B. B drop并创建表。现在Proc A现在正在引用创建的临时表,或者由于Proc A没有嵌套在B中,Proc A神秘失败。当proc B尝试创建临时表时,最好让它失败。
在一天结束时,SQL Server会清理它们,但它不会阻止您在嵌套过程之间泄漏。