2014-01-23 39 views
2

內部存儲過程中臨時表:創建IF子句

IF (condition1) 
    SELECT * INTO #temp FROM table1 WHERE name = 'Dave' 
ELSE 
    SELECT * INTO #temp FROM table1 WHERE name = 'Greg' 

當創建存儲過程時,它說:「已經有一個名爲‘#TEMP’數據庫中的對象」。它必須認爲我正在創建兩個相同的臨時表。

有沒有很好的解決辦法?

我知道我可以做INSERT INTO #temp(....), 但有很多字段,我不想重新輸入它們。

+0

請確保在數據庫中沒有名爲#temp的表或在select語句之前使用drop table。 –

+0

錯誤發生在編譯時。它甚至不會創建sproc。它認爲我正在創建#temp兩次。 – David

+0

我相信如果你在選擇語句之前進行檢查(如果#temp不存在),它不會中斷。 –

回答

0

你試過:

 If (condition1) 
     INSERT INTO #temp 
      SELECT * FROM table1 where name = 'Dave' 
    ELSE 
     INSERT INTO #temp 
     SELECT * FROM table1 where name = 'Greg' 
+0

這會給你「無效的對象名'#temp' 你必須先創建臨時表 但是我不想因爲它有很多字段 – David

1

試試這個:

SELECT * INTO #temp FROM table1 WHERE 1 = 0 

IF (condition1) 
    INSERT INTO #temp SELECT * FROM table1 WHERE name = 'Dave' 
ELSE 
    INSERT INTO #temp SELECT * FROM table1 WHERE name = 'Greg' 

到選擇不返回任何行,但它將使臨時表與正確的列。

+0

這會工作,但它會產生開銷第一個SELECT,另外,我會做SELECT TOP 0 * INTO #temp FROM table1 – David

2

如果這是愚蠢的不-1
只要讓我知道,我會刪除
我不知道你的條件1

的通過,爲什麼不自然?

SELECT * INTO #temp 
    FROM table1 
WHERE (condition1 and name = 'Dave') 
    OR (!condition1 and name = 'Greg') 
+0

我不認爲它很愚蠢,事實上,這可能是最好的解決方案,不幸的是,它可能不適用於「真實世界」。就像示例代碼是針對該問題的示例一樣,實際上,條件可能要複雜得多,或者源表(在此示例中爲table1)對於每個條件可能並不相同 –

+0

@Gastros但是,如果我剛纔要求澄清條件1,OP可能沒有理解這個問題。 – Paparazzi

+0

它可以完成,但至少在我的情況下,它有明顯的性能結果CES。我最終創建了一個臨時表,然後執行INSERT INTO。 – David