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