临时表范围?

sol*_*man 8 sql t-sql stored-procedures sql-server-2005

我在我的存储过程中使用临时表#tempTable - 我用它来运行我的ASP.net报告(报告服务)

我正在做类似的事情

例如.码

SELECT * INTO #tempTable FROM Contacts WHERE ContactID < 10
Run Code Online (Sandbox Code Playgroud)

然后我用类似的东西

SELECT o.* FROM #tempTable t INNER JOIN Orders o ON t.ContactID =o.ContactID
Run Code Online (Sandbox Code Playgroud)

将值返回到我的报告,即存储过程的结果

我没有摆脱我的#tempTable

即我不这样做

DROP TABLE #tempTable
Run Code Online (Sandbox Code Playgroud)

我已经读过临时表的范围只适用于存储过程 - 所以做了以上必要的操作 - 如果我不做上面的话我将来会遇到什么问题

Tho*_*mas 11

首先,一旦过程完成,就会删除在过程中创建的本地临时表.从创建表上BOL:

存储过程完成时,将自动删除在存储过程中创建的本地临时表.该表可以由创建该表的存储过程执行的任何嵌套存储过程引用.调用创建表的存储过程的进程无法引用该表.

如果您的数据访问代码正确地打开了连接,调用存储过程然后关闭连接,则会在该过程中创建临时表被有效销毁.

我说"有效地"提出另一点.我不建议在程序结束时删除临时表,尽管我会在创建临时表之前添加一个检查,如果存在则删除它(例如if object_id('tempdb..#Foo') is not null).反对在最后删除临时表的论点是,通过调用Drop语句,您迫使SQL Server在等待程序结束时花费资源来销毁表.相反,如果你让它超出范围,你的程序立即结束,你让SQL Server在它自己选择的时候销毁表.


小智 7

#Temp表的范围仅限于您的会话和批处理的生命周期,这意味着没有其他人可以看到您的临时表,其他任何人都可以使用相同的名称创建自己的#Temp表.会话或批处理结束后,SQL Server将清理临时表.

另一方面,## Temp表的行为类似于普通表.每个人都可以看到它,并且不能有超过1个## Temp表具有相同的名称.SQL Server将在服务器重新启动时清除这些## Temp表.

  • 这不完全准确.临时表不限于批次的范围 - 无论批次如何,它们都可以在整个会话中存活.也就是说,你可以创建一个临时表,使用`GO`,临时表仍然存在其数据. (7认同)

Myl*_*s J 4

显式删除您创建的每个临时表被认为是良好的编码实践。如果您通过 SQL Server Management Studio/查询分析器执行脚本,临时表将被保留,直到您显式删除它们或直到您关闭会话。