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

您收到此错误。

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

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
有帮助吗?

解决方案

这是一个由两部分组成的问题,虽然 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。

其他提示

由于延迟名称解析,您不能这样做,您可以使用真实的表来完成此操作,只需取出井号即可

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

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

另外,希望表和字段名称针对您的示例进行了简化,而不是您想要的 真的 给他们打电话 ;)

——凯文·费尔柴尔德

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

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

抱歉,我无法提供更详细的信息,但由于您甚至没有尝试解释您所看到的内容,所以您得到的答案并不那么出色。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top