题
为什么你不能这样做,有解决办法吗?
您收到此错误。
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 编辑工具并重试。