2010-10-20 45 views
3

我拿起類似於下面的一些SQL:如何插入tempoary表兩次

IF EXISTS(SELECT name FROM tempdb..sysobjects WHERE name Like N'#tmp%' 
and id=object_id('tempdb..#tmp')) 
DROP TABLE #tmp 

into #tmp 
select * from permTable 

我需要添加更多的數據繼續處理之前#tmp:

insert into #tmp 
select * from permTable2 

但這會給出錯誤,因爲SQL假定了#tmp列的大小和類型(例如,如果permTable有一列填充了整數,但permTable2的列有相同的名稱,但在您獲得的一條記錄中有一個NULL「無法將值NULL插入列'IsPremium ',表'tempdb.dbo。#tmp「)。

我該如何獲得#tmp來獲得我想要的類型?這是非常糟糕的做法嗎?

+0

你是說permTable和permTable2有不同的模式? – 2010-10-20 15:10:31

+0

他們不存在,因爲這是一個簡化的例子,但爲了這個例子的目的,這些表格將具有相同的模式 – Patrick 2010-10-20 15:11:43

+1

順便說一句 - 我會避免選擇*進入 - 這將使源表的任何改變一個突破性的變化。 – 2010-10-20 15:13:16

回答

5

您是否考慮過創建表var?您可以聲明像這樣的列

declare @sometable table(
    SomeField [nvarchar](15), 
    SomeOtherField [decimal](15,2)); 
+0

很酷,看起來不錯。 sometable是否在同一個地方創建,與#tmp具有相同的生命週期? – Patrick 2010-10-20 15:13:34

+1

表變量超出了過程或函數的範圍,臨時表在會話結束時超出範圍。請參閱http://databases.aspfaq.com/database/should-i-use-a-temp-table-or-a-table-variable.html瞭解更多詳情 – 2010-10-20 15:20:09

+0

偉大的鏈接,謝謝 – Patrick 2010-10-20 15:32:15

1

這就是爲什麼選擇進入是你的問題一個不好的主意。使用create table命令專門創建表結構,然後編寫兩個插入語句。