0

为什么你不能这样做,有解决办法吗?

你得到这个错误。

消息 2714,级别 16,状态 1,第 13 行数据库中已经有一个名为“#temptable”的对象。

declare @x int

set @x = 1

if (@x = 0)
begin
    select 1 as Value into #temptable
end
else
begin
   select 2 as Value into #temptable
end

select * from #temptable

drop table #temptable
4

6 回答 6

1

由于名称解析延迟,你不能这样做,你可以用一张真实的桌子来做,只需去掉井号

您也可以先在顶部创建临时表,然后定期插入表

于 2008-09-05T18:42:33.613 回答
1

第一步...检查表是否已经存在...如果存在,请将其删除。接下来,显式创建表而不是使用 SELECT INTO...

这样你会发现它更可靠。

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN
DROP TABLE #temptable
END

CREATE TABLE #temptable (Value INT)

declare @x int

set @x = 1

if (@x = 0)
begin
    INSERT INTO #temptable (Value) select 1
end
else
begin
    INSERT INTO #temptable (Value) select 2
end

select * from #temptable

drop table #temptable

另外,希望表和字段名称为您的示例而简化,而不是您真正称呼它们的名称;)

——凯文·费尔柴尔德

于 2008-09-05T18:57:40.253 回答
1

延迟名称解析也是您无法确定 sp_depends 给出正确结果的原因,请查看我不久前写的这篇文章您是否依赖于 sp_depends(不是双关语)

于 2008-09-05T19:02:18.167 回答
1

这是一个由两部分组成的问题,虽然 Kev Fairchild 对第二个问题提供了很好的答案,但他完全忽略了第一个问题 -为什么会产生错误?

答案在于预处理器的工作方式。这

SELECT field-list INTO #symbol ...

被解析为直接等价于的解析树

DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...

这会将#symbol 放入本地范围的名称表中。带_sessionid的业务是为每个用户会话提供一个私有的命名空间;如果您指定两个哈希 (##symbol),则会抑制此行为。sessionid 扩展的修改和取消修改(显然)是透明的。

所有这一切的结果是多个 INTO #symbol 子句在同一范围内产生多个声明,导致 Msg 2714。

于 2008-09-29T04:58:08.787 回答
0

我猜这个问题是你没有创建#temptable。

抱歉,我不能更详细,但由于您甚至没有尝试解释您所看到的内容,因此您得到的答案并不那么出色。

于 2008-09-05T18:41:06.127 回答
0

从代码的外观看来,您可能已经在 SQL Studio 或类似工具中对此进行了原型设计,对吧?我能猜出你已经运行了几次并且让它达到了创建#temptable但在它结束并再次删除表之前失败了吗?重新启动您正在使用的 SQL 编辑工具,然后重试。

于 2008-09-05T18:47:13.117 回答