Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么可以';我不能从SSMS一行创建两个临时表吗?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为什么可以';我不能从SSMS一行创建两个临时表吗?

Sql 为什么可以';我不能从SSMS一行创建两个临时表吗?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我可能从根本上误解了临时表- 但在SSMS内部,我有以下几点: Create Table #temp(FromUserId int, ToUserId int, FromAction int, ToAction int, IsMatch int) 如果执行两次,则会出现以下错误: There is already an object named '#temp' in the database. 如果桌子是临时的,为什么会发生这种情况 临时表将持续到显式删除或创建临时表的会话结束。 尝试关闭S

我可能从根本上误解了临时表-

但在SSMS内部,我有以下几点:

Create Table #temp(FromUserId int, ToUserId int, FromAction int, ToAction int, IsMatch int)
如果执行两次,则会出现以下错误:

There is already an object named '#temp' in the database.

如果桌子是临时的,为什么会发生这种情况

临时表将持续到显式删除或创建临时表的会话结束。
尝试关闭SSMS中的查询窗口并打开一个新窗口。您的临时表在新查询窗口中将不可用。

每个SSMS选项卡都有自己的连接。您创建的任何临时对象都不会被删除,除非您将其关闭或显式删除。它实际上是非常有用的行为。

临时表的作用域要么是连接的本地作用域,要么是所有连接的全局作用域。当我用临时表构建过程时,我在一个普通的查询窗口中工作,并且在每次创建之前都有一个drop语句。然后,当所有设置完成后,我添加创建过程代码并注释掉drop table语句,因为在正常执行期间,临时表还不存在。这是一篇关于临时表的非常好的文章


我想补充一点,如果您的过程或代码包含一个SELECT INTO#tmp或CREATE TABLE#tmp,那么您可以在过程/查询的开头包含以下语句:

IF OBJECT_ID(tempDB..#Tmp) IS NOT NULL DROP TABLE #tmp

这将确保您可以重用proc,而不用担心创建/使用已经存在的表。

仅仅因为它是临时的并不意味着它不存在。您需要删除它或保留要删除的表的范围。实际上,我看到了相反的情况(在一些公认不可靠的代码中)-请尝试运行以下命令:
CREATE table#test(column1int);--如果(OBJECT_ID('tempdb..#test')不为NULL)DROP TABLE#test CREATE TABLE#test(column1int);--这些行是相同的
i可能是错误的,但是在上面的代码用BEGIN包装DROP TABLE语法的情况下。。。END或至少一个语句终止符可能会解决这个问题。在我的沙盒上尝试了您的代码后,我认为可以通过省略语句的第一行来避免编译错误。在此之后,整个批处理变为可重新执行