2013-08-19 40 views
27

我已經在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'的對象。任何人都可以告訴我爲什麼我得到這個錯誤?

回答

51

您正在刪除它,然後創建它,然後嘗試使用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,您可以通過使用SELECT INTO

5

創建一個沒有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 

避免使用INSERT INTO 因爲如果你使用插入,然後在未來,如果你想加入,可一些加工後充填(不隨插入)一個新列修改臨時表。那時你需要以同樣的方式重新設計和設計它。

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

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

優勢 無需刪除語句,因爲這將是類似的變量。範圍在執行後立即結束。

21

我通常把這些行放在存儲過程的開頭,然後放在最後。

這是#temp表的「存在」檢查。

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

在我看來,這似乎還不夠。僅僅在同一個「SELECT MyField INTO #TempTable」中寫入兩次的事實足以導致編譯錯誤。這兩個select into不能同時被擊中,因爲它們在IF的不同分支中。那麼,我不能同時寫兩次SELECT INTO –

+0

不要使用Select-Into。它是一個「捷徑」。創建#tempTable,使用「Insert Into #MyTemp Select Col1,Col2 from dbo.MyTable」語法。 – granadaCoder

3

有些時候,你可能會做出愚蠢的錯誤一樣在相同的.sql文件寫入插入查詢(在同一個工作區/片),所以一旦你執行在您創建查詢寫的正上方,並已經執行插入查詢它將再次開始與插入查詢一起執行。

這就是我們獲取對象名(表名)已存在的原因,因爲它已經被第二次執行了。

因此,轉到單獨的選項卡來編寫插入或刪除或任何您要執行的查詢。

或者在同一個工作區的所有查詢之前一樣

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

雖然OP在討論表,如果有問題的對象是一個存儲過程,請確保您使用「使用註釋行改變」功能:

ALTER PROCEDURE

如果您粘貼代碼,喲你可能需要用「改變」來代替「創造」...這只是發生在我身上,令人沮喪,所以我希望這發生在別人身上。

相關問題