2016-05-09 53 views
0

我有下面的代碼塊:與全局臨時表時,當它們不存在

DECLARE @TTable VARCHAR(MAX)= 'SELECT X.* '; 
SELECT @TTable+=' 
INTO ##NewTemp1' + convert(varchar(6), @TStamp) + ' 
FROM (
SELECT * 
FROM ##Temp1' + convert(varchar(6), @TStamp) + ' 
UNION 
SELECT * 
FROM ##Temp2' + convert(varchar(6), @TStamp) + ' 
UNION 
SELECT * 
FROM ##Temp3' + convert(varchar(6), @TStamp) + ' 
... 
etc 
... 
UNION 
SELECT * 
FROM ##Temp22' + convert(varchar(6), @TStamp) + ' 
UNION 
SELECT * 
FROM ##Temp23' + convert(varchar(6), @TStamp) + ' 
) X' 
PRINT(@TTable); 
EXECUTE(@TTable); 

的問題是,對臨時表的場合一個(或多個)不會得到創建。當發生這種情況時,這段代碼會失敗,因爲它試圖聯合一個不存在的表。

我知道我可以使用下面的代碼行,以確定是否一個臨時表存在:

IF OBJECT_ID('tempdb..#Results') IS NOT NULL 

,但我怎麼能是整合成一個字符串像我在上面使用(@TTable)檢查並確保一個表在工會之前存在?

回答

1

的最好的事情將得到徹底擺脫這個爛攤子的,但如果你要堅持動態全局臨時表之間來回移動數據,那麼你就需要動態地構建字符串:

DECLARE @TTable VARCHAR(MAX) = 'SELECT X.col1, X.col2' -- Because we NEVER use SELECT * 

SELECT @TTable += ' INTO ##NewTemp1' + CONVERT(VARCHAR(6), @TStamp) + -- You should probably put a format here 
    ' FROM (' 

IF (OBJECT_ID('##Temp1' + CONVERT(VARCHAR(6), @TStamp)) IS NOT NULL) 
    SELECT @TTable += 'SELECT col1, col2 FROM ##Temp1' + CONVERT(VARCHAR(6), @TStamp) + ' 
UNION 
' 
... Repeat for each temp table 

SELECT @TTable += ' SELECT 1 AS col1, 1 AS col2 WHERE 1=0) X' 

最後一行是爲了避免UNION因爲不知道哪個臨時表可能存在或不存在而在最後懸浮。