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

Art*_*t F 44 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

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

Har*_* CO 65

您正在删除它,然后创建它,然后尝试使用再次创建它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
Run Code Online (Sandbox Code Playgroud)

在MS SQL Server中,您可以使用创建没有CREATE TABLE语句的表SELECT INTO

  • 我使用 SELECT INTO 而不是 CREATE TABLE,但仍然收到错误“数据库中已经存在一个名为“#MyTempTable”的对象。” (2认同)

gra*_*der 32

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

它是#temp表的"存在"检查.

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
        drop table #MyCoolTempTable
end
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,这还不够。我在同一选择中两次选择相同的“ SELECT MyField INTO #TempTable”这一事实就足以引起编译错误。不能同时击中两个select into,因为它们位于IF THEN ELSE的不同分支中:尽管如此,我不能将相同的SELECT INTO写两次 (4认同)

kbv*_*hnu 7

您必须像这样修改查询

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
Run Code Online (Sandbox Code Playgroud)

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

DROP TABLE #TMPGUARDIAN
Run Code Online (Sandbox Code Playgroud)

避免使用insert into 因为如果你想使用insert in将来修改temp表,你可以通过添加一个可以在某个进程之后填充的新列来修改(不是与insert一起).那时,您需要以相同的方式进行返工和设计.

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

declare @userData TABLE(
 LAST_NAME NVARCHAR(30),
    FRST_NAME NVARCHAR(30)
)
Run Code Online (Sandbox Code Playgroud)

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