【发布时间】:2020-02-05 00:49:41
【问题描述】:
我有以下无法执行的代码。我不是在寻找解决方法。我想了解 SQL 在做什么以及为什么它会因错误而失败:“数据库中已经有一个名为 '#t' 的对象。”请注意解释。
if object_id('tempdb.dbo.#t') is not null
drop table #t
GO
declare @i int = 0
if @i = 0
create table #t (col1 int)
else
create table #t (col1 int)
【问题讨论】:
-
如果您添加了 sql 标签和您正在使用的特定 DBMS 的标签,将会很有帮助。
-
蒂肯。我刚刚做了
-
这正是您要执行的脚本吗?
-
没有。这是完整脚本的简化。完整的脚本没有意义。错误是一样的
-
这是对编译工作方式的限制。有条件地创建临时表充满了危险,因为优化器确实需要知道该表是否存在(及其模式)来为引用它的语句生成执行计划,所以
#t在任何地方仍然被认为是“相同的”表它发生了,因此不允许重复的CREATEs(与其他不兼容的 DDL 语句一样)。大致上,根本不要这样做。保持您的临时表方案不变,不要有条件地创建它们。 FWIW,你可以有条件地ALTER他们。
标签: sql sql-server temp-tables