SQL Server 2005错误
我们为什么不能这样做,并且周围有解决方法?
我们收到此错误。
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.