2008-09-05 200 views
0

为什么你不能这样做,是否有解决方法?SQL Server 2005错误

你得到这个错误。

Msg 2714,Level 16,State 1,Line 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 

回答

1

这是一个两部分的问题,而凯夫费尔奇尔d为他完全忽略第一个问题的第二个问题提供了很好的答案 - 为什么会产生错误?

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

SELECT field-list INTO #symbol ... 

被解析成解析树是直接等同于

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

这把#符号到局部范围的名称表。具有_sessionid的业务是为每个用户会话提供一个私有名称空间;如果您指定了两个哈希(##符号),则会禁止此行为。对sessionid扩展的调用和解除是(透彻)透明的。

所有这些的结果是多个INTO#符号条款在同一范围内产生多个声明,导致消息2714.

0

我会猜测问题是您还没有创建#temptable。

对不起,我不能更详细的,但因为你甚至没有试图解释你所看到的,你得到的不是恒星的答案。

1

你不能这样做,因为延迟名称解析的,你可以用一个真正的表做到这一点,就掏出英镑迹象

你也可以先创建顶部的临时表,然后做一个普通插入表

0

从代码的外观看来,你似乎可能已经在SQL Studio或类似的原型这样做吧?我可以猜测你已经运行了几次,并且已经达到了创建#temptable的阶段,但是在它结束之前失败了,并且再次丢弃了这个表格?重新启动您正在使用的SQL编辑工具,然后重试。

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 

此外,希望的表和字段名称被简化为您的例子,是不是你真的他们;)

- 凯文飞兆半导体