SQL 服务器中的临时表导致“已经有一个名为”的对象错误

我在 SQLServer 中遇到了以下问题,我有一些代码如下所示:

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’在数据库’。有人能告诉我为什么我会得到这个错误吗?

244173 次浏览

你正在删除它,然后创建它,然后尝试通过使用 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

在 MSSQLServer 中,您可以使用 SELECT INTO创建一个没有 CREATE TABLE语句的表

您必须像这样修改查询

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

避免使用插入到 因为如果你使用插入,那么在将来,如果你想修改临时表,添加一个新的列,可以填充后,一些进程(不随着插入)。那时,您需要以相同的方式重新工作和设计它。

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

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

好处 不需要 Drop 语句,因为这将类似于变量。

我通常将这些行放在存储过程的开头,然后放在结尾。

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

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

完整例子:

(注意任何“ SELECTINTO”语句的 LACK)

CREATE PROCEDURE [dbo].[uspTempTableSuperSafeExample]
AS
BEGIN
SET NOCOUNT ON;




IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
BEGIN
DROP TABLE #MyCoolTempTable
END




CREATE TABLE #MyCoolTempTable (
MyCoolTempTableKey INT IDENTITY(1,1),
MyValue VARCHAR(128)
)




INSERT INTO #MyCoolTempTable (MyValue)
SELECT LEFT(@@VERSION, 128)
UNION ALL SELECT TOP 3 LEFT(name, 128) FROM sysobjects


INSERT INTO #MyCoolTempTable (MyValue)
SELECT TOP 3 LEFT(name, 128) FROM sysobjects ORDER BY NEWID()


ALTER TABLE #MyCoolTempTable
ADD YetAnotherColumn VARCHAR(128) NOT NULL DEFAULT 'DefaultValueNeededForTheAlterStatement'


INSERT INTO #MyCoolTempTable (MyValue, YetAnotherColumn)
SELECT TOP 3 LEFT(name, 128) , 'AfterTheAlter' FROM sysobjects ORDER BY NEWID()




SELECT MyCoolTempTableKey, MyValue, YetAnotherColumn FROM #MyCoolTempTable






IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
BEGIN
DROP TABLE #MyCoolTempTable
END




SET NOCOUNT OFF;
END
GO

输出 ~ 样本:

1   Microsoft-SQL-Server-BlahBlahBlah DefaultValueNeededForTheAlterStatement


2   sp_MSalreadyhavegeneration  DefaultValueNeededForTheAlterStatement


3   sp_MSwritemergeperfcounter DefaultValueNeededForTheAlterStatement


4   sp_drop_trusted_assembly    DefaultValueNeededForTheAlterStatement


5   sp_helplogreader_agent  DefaultValueNeededForTheAlterStatement


6   fn_MSorbitmaps  DefaultValueNeededForTheAlterStatement


7   sp_check_constraints_rowset DefaultValueNeededForTheAlterStatement


8   fn_varbintohexstr   AfterTheAlter


9   sp_MSrepl_check_publisher   AfterTheAlter


10  sp_query_store_consistency_check    AfterTheAlter

另外,在这里(关于“什么是 # temp 表的 SCOPE”)可以看到我的答案: https://stackoverflow.com/a/20105766/214977

有时候,您可能会犯一些愚蠢的错误,比如在同一个文件上编写插入查询。Sql 文件(在相同的工作区/选项卡中) ,因此一旦执行了插入查询(其中创建查询刚刚在上面写入并已经执行) ,它将再次与插入查询一起开始执行。

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

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

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

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

In Azure Data warehouse also this occurs sometimes, because temporary tables created for a user session.. I got the same issue fixed by reconnecting the database,

我发现我也有同样的问题:

DROP TABLE IF EXISTS #MyTempTable
CREATE TABLE #MyTempTable (
MyTempTableID INT,
OtherColID INT
);

但是我能够通过用 GO 分离语句来解决这个问题。

DROP TABLE IF EXISTS #MyTempTable
GO
CREATE TABLE #MyTempTable (
MyTempTableID INT,
OtherColID INT
);