2017-04-25 57 views
0

嗨我有一個臨時表,其中我試圖插入基於where條件的記錄,但它會拋出一個錯誤,它已經存在。 我試圖更改名稱,但這不是問題,因爲臨時表在會話結束時被刪除。臨時表已存在

我想我正在寫查詢的權利。

SELECT [Name] 
     INTO #TEMP_REJECT 
     FROM #TEMP_VALIDATION 
     WHERE Name = @Name 

我試圖插入#TEMP_REJECT FROM #TEMP_VALIDATION

錯誤消息

「目前已經在數據庫中名爲 '#TEMP_REJECT' 的對象。」

請建議。

謝謝你的幫助。 [R

+0

您能否給我們您遇到確切的錯誤信息?同時給我們表格的定義。 – Hybris95

+1

嗨我已經更新了錯誤消息'數據庫中已有名爲'#TEMP_REJECT'的對象'的問題。' – BRDroid

+0

非主題,可能值得考慮表變量 - http:// stackoverflow。com/questions/11857789/when-should-i-use-a-table-variable-vs-temporary-table-in-sql-server – user5226582

回答

2

如果不存在表,則SQL Server不會告訴您該表不存在。

我建議你在SELECT語句前加上

IF OBJECT_ID('tempdb..#TEMP_REJECT') IS NOT NULL 
    DROP TABLE #TEMP_REJECT 

。這保證了執行select時臨時表不會存在。

所以,你的發言變得

IF OBJECT_ID('tempdb..#TEMP_REJECT') IS NOT NULL 
     DROP TABLE #TEMP_REJECT 

SELECT [Name] 
      INTO #TEMP_REJECT 
      FROM #TEMP_VALIDATION 
      WHERE Name = @Name 
+0

非常感謝,解決了它 – BRDroid

2

這個答案將幫助您: https://stackoverflow.com/a/8560644/3635715

作簡短:SELECT INTO創建表,然後插入記錄。 INSERT INTO只插入記錄。

你的情況

所以,既然#TEMP_REJECT已經存在,SELECT INTO被拒絕,因爲它不能再創建表,所以你必須先SELECT INTO後使用INSERT INTO

IF OBJECT_ID('tempdb..#TEMP_REJECT') IS NOT NULL 
BEGIN 
    INSERT INTO #TEMP_REJECT 
    SELECT [Name] 
    FROM #TEMP_VALIDATION 
    WHERE Name = @Name 
END 
ELSE 
BEGIN 
    SELECT [Name] 
    INTO #TEMP_REJECT 
    FROM #TEMP_VALIDATION 
    WHERE Name = @Name 
END 

參考文獻:
INTO Clause
INSERT Clause

1

嘗試,如果OBJECT_ID插入

前檢查( 'tempdb中..#TEMP_REJECT')不爲空 DROP TABLE #TEMP_REJECT

SELECT [Name] 
     INTO #TEMP_REJECT 
     FROM #TEMP_VALIDATION 
     WHERE Name = @Name 

如果SQL說,有臨時表,在插入之前必須有一個表