SELECT INTO如果使用超过一次就会失败——即使表首先被删除



我在Microsoft SQL Server 2012 (SP4-GDR)中使用SELECT into遇到了一个令人沮丧的错误。(我使用SSMS 18.12.1运行查询,但使用不同的查询工具遇到相同的错误。)

下面的例子演示了它:

--First, create a small table with some dummy data
CREATE TABLE Foo (
Luke varchar(10),
Leia varchar(10),
Han varchar(10)
)
INSERT INTO Foo (Luke, Leia, Han)
VALUES  ('Blah','Nope','Yeeha'),
('Test','123','Yep');
--SELECT INTO then DROP (first time)
SELECT * INTO ##Temp1 FROM Foo;
DROP TABLE ##Temp1;
--SELECT INTO then DROP (second time)
SELECT * INTO ##Temp1 FROM Foo;
DROP TABLE ##Temp1;

显然,期望的结果只是这段代码运行到完成—但是我得到了这个错误(这适用于第14行第二次尝试SELECT INTO):

Msg 2714, Level 16, State 1, Line 14
数据库中已经有一个名为'##Temp1'的对象

问题是我是否使用全局临时表(##Temp1)或本地临时表(#Temp1)but在选择到一个普通的本地表时同样成功。

我有创建和删除临时表的权限。如果我单独运行查询的每一步,就没有问题。同样,如果我在查询的每一步之后都声明GO。但是作为一个批处理运行失败。

在第一次DROP和第二次SELECT INTO之间强制延迟是没有帮助的。

这相当令人困惑。这是一个错误在SQL Server 2012或我做错了什么?

在开头添加一个DROP TABLE IF EXISTS,并使用GO语句将不同批次的代码分开

DROP TABLE IF EXISTS ##Temp1;
GO
CREATE TABLE Foo (
Luke varchar(10),
Leia varchar(10),
Han varchar(10)
)
INSERT INTO Foo (Luke, Leia, Han)
VALUES  ('Blah','Nope','Yeeha'),
('Test','123','Yep');
GO
--SELECT INTO then DROP (first time)
SELECT * INTO ##Temp1 FROM Foo;
DROP TABLE ##Temp1;
GO
--SELECT INTO then DROP (second time)
SELECT * INTO ##Temp1 FROM Foo;
DROP TABLE ##Temp1;
GO

最新更新