SQL服务器中的临时表导致“已存在名为'的对象错误

时间:2013-08-19 19:07:49

标签: sql sql-server tsql temp-tables

我在SQL Server中遇到以下问题,我有一些看起来像这样的代码:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN  FROM TBL_PEOPLE

当我这样做时,我收到错误'数据库中已经有一个名为'#TMPGUARDIAN'的对象'。谁能告诉我为什么会收到这个错误?

5 个答案:

答案 0 :(得分:61)

您正在删除它,然后创建它,然后尝试使用SELECT INTO再次创建它。改为:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN 
SELECT LAST_NAME,FRST_NAME  
FROM TBL_PEOPLE

在MS SQL Server中,您可以使用CREATE TABLE

创建一个没有SELECT INTO语句的表

答案 1 :(得分:29)

我通常把这些行放在我的存储过程的开头,然后放在最后。

这是#temp表的“存在”检查。

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
        drop table #MyCoolTempTable
end

答案 2 :(得分:6)

您必须像这样修改查询

CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN(FRST_NAME,LAST_NAME)
SELECT LAST_NAME,FRST_NAME  FROM TBL_PEOPLE

- 建立最后一个会话以清除所有临时表。总是落在最后。在您的情况下,有时,如果表不存在,可能会发生错误,而您尝试删除。

DROP TABLE #TMPGUARDIAN

避免使用插入 因为如果你想通过添加一个新的列来修改临时表,如果你在将来使用insert,那么可以在一些进程之后填充(而不是与insert一起填充)。那时,你需要以同样的方式进行返工和设计。

使用表变量http://odetocode.com/articles/365.aspx

declare @userData TABLE(
 LAST_NAME NVARCHAR(30),
    FRST_NAME NVARCHAR(30)
)

<强>优点 不需要Drop语句,因为这与变量类似。范围在执行后立即结束。

答案 3 :(得分:3)

有时你可能会犯同样的.sql文件(在同一个工作区/标签中)编写插入查询这样的愚蠢错误,所以一旦你执行了插入查询,你的创建查询就在上面编写并且已经执行了,它将再次出现开始执行插入查询。

这就是为什么我们已经获得对象名称(表名)的原因,因为它已经第二次执行了。

因此,请转到单独的选项卡以编写插入或删除或您要执行的任何查询。

或者在同一工作区中的所有查询之前使用注释行,如

CREATE -- …
-- Insert query
INSERT INTO -- …

答案 4 :(得分:0)

在Azure数据仓库中有时也会发生这种情况,因为为用户会话创建了临时表。通过重新连接数据库,我也解决了相同的问题,