SQL Server 2005错误

时间:2020-03-05 18:48:25  来源:igfitidea点击:

我们为什么不能这样做,并且周围有解决方法?

我们收到此错误。

Msg 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

解决方案

回答

我猜想问题在于我们尚未创建#temptable。

抱歉,我无法更详细地介绍信息,但是由于我们甚至都没有尝试解释自己所看到的内容,因此我们得到的答案不及一般。

回答

由于延迟的名称解析,我们无法执行此操作,我们可以使用真实的表来执行此操作,只需取出井号

我们也可以先在顶部创建临时表,然后在表中进行常规插入

回答

从代码的外观来看,我们似乎可能已经在SQL Studio或者类似产品中对此进行了原型设计,对吗?我可以猜想我们已经运行了几次,并使其达到了创建#temptable的地步,但是在结束并再次删除表之前失败了吗?重新启动我们使用的SQL编辑工具,然后重试。

回答

第一步...检查表是否已经存在...如果存在,则将其删除。接下来,显式创建表,而不是使用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

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

-凯文·费尔柴尔德(Kevin Fairchild)

回答

延迟的名称解析也是我们不确定sp_depends是否会返回正确结果的原因,请查看我之前写的这篇文章我们是否依赖sp_depends(无双关语)

回答

这是一个分为两部分的问题,而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子句在同一作用域中产生多个声明,从而导致消息2714.