我可能从根本上误解了临时表 -
但是从SSMS内部,我有以下内容:
Create Table #temp(FromUserId int, ToUserId int, FromAction int, ToAction int, IsMatch int)
如果我执行两次,我收到错误:
There is already an object named '#temp' in the database.
如果表是#temporary,为什么会发生这种情况?
答案 0 :(得分:5)
每个SSMS选项卡都是自己的连接。您创建的任何临时对象都不会被删除,直到您关闭它或显式删除它为止。这实际上非常有用。
答案 1 :(得分:3)
临时表具有连接本地范围或所有连接的全局范围。当我使用临时表构建过程时,我在普通查询窗口中工作,并且在每次创建之前都有一个drop语句。然后,当它全部设置时,我添加创建过程代码并注释掉drop table语句,因为在正常执行期间临时表还不存在。这是关于临时表主题的非常好的文章。
https://www.simple-talk.com/sql/t-sql-programming/temporary-tables-in-sql-server/
答案 2 :(得分:2)
临时表将持续到显式删除或创建它的会话结束。 尝试在SSMS中关闭查询窗口并打开一个新窗口。您的临时表将无法在新查询窗口中使用。
答案 3 :(得分:0)
我想补充一点,如果您的过程或代码在行下面包含SELECT INTO #tmp或CREATE TABLE #tmp,则可以在过程/查询的开头包含以下语句:
IF OBJECT_ID(tempDB..#Tmp) IS NOT NULL DROP TABLE #tmp
这将确保您可以重用proc而不必担心尝试创建/使用已存在的表。