0

我需要記錄的任一組A或集合B插入到#temptable,根據一定的條件IF ... ELSE ...兩個相互排斥的插入到#temptable

我的僞代碼:

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

IF {some-condition} 
    SELECT {columns} 
    INTO #t1 
    FROM {some-big-table} 
    WHERE {some-filter} 
ELSE 
    SELECT {columns} 
    INTO #t1 
    FROM {some-other-big-table} 
    WHERE {some-other-filter} 

上述兩個選擇是獨佔的(由ELSE運算符保證)。但是,SQL編譯器試圖智取我並拋出以下消息:

There is already an object named '#t1' in the database. 

我的想法「固定」是創建#T1的前期,然後執行一個簡單的INSERT INTO(而不是SELECT ... INTO) 。但我喜歡極簡主義,我想知道這是否可以以更簡單的方式實現,即沒有明確的CREATE TABLE#t1。

順便說一句,爲什麼它不給我在第一行條件DROP TABLE錯誤?就是想。

+1

要回答你最後一個問題;只有'IF'語句返回true時,纔會執行DROP TABLE#t1,即表存在。正如你所說的你想簡化,你可以把它重寫爲'IF EXISTS(OBJECT_ID('tempdb ..#t1'))DROP TABLE#t1;'。 –

+0

@PatrikBirgersson我明白了!但是,我並不想知道如何簡化這一行代碼。更多的是關於不能在分支IF ... ELSE塊中運行條件SELECT ... INTO #temptable ...與能夠在第一行中執行#temptable的條件DROP之間的不一致之處。拉傑什的回答清除了我所有的疑慮。 –

回答

2

在單個SQL批處理中不能有2個具有相同名稱的臨時表。 MSDN文章之一說:「如果在單個存儲過程或批處理中創建多個臨時表,它們必須具有不同的名稱」。您可以在IF-Else塊之外聲明2個不同的臨時表或表變量/臨時表。

0

使用Dyamic sql我們可以處理這種情況。作爲發展者,這不是一個好的做法。最好使用表變量或臨時表。

IF 1=2 
BEGIN 
EXEC ('SELECT 1 ID INTO #TEMP1 
SELECT * FROM #TEMP1 
') 
END 
ELSE 
EXEC ('SELECT 2 ID INTO #TEMP1 
SELECT * FROM #TEMP1  
') 
+0

謝謝,這肯定會工作到某一點,即它會填充#temp,然後返回其所有行。但是,我在隨後的查詢中使用#temp表,這使得您的方法不適合我的情況。我最終創建了一個#temp表,並用INSERT INTO填充它... –