2009-04-22 24 views
2

好吧,我有可能是一個非常容易的問題你的Sql大師在那裏...如何選擇如何在sql中填充#temptable?

給定一種布爾值T,我想填充一個臨時表與數據集A,如果如果T爲假,則T爲真或數據集B.我認爲這將是如何做到這一點:

DECLARE @foo INT 
SET @foo = null 

IF (@foo is null) 
    BEGIN 
     SELECT 'foo was null' INTO #TempTable 
    END 
ELSE 
    BEGIN 
     SELECT 'foo not null' INTO #TempTable 
    END 

但這不起作用。我收到一條錯誤消息:「數據庫中已經有一個名爲'#TempTable'的對象。」

很顯然Sql試圖在每種情況下創建表,然後才評估條件...?這對我來說似乎很奇怪,但好吧......但是做這種事情的正確方法是什麼?

編輯︰我在Sql服務器,但我懷疑這是一個更普遍的問題......但如果我錯了,請讓我知道。

+0

答案已更新。您可以再次檢查並嘗試先創建表格,然後插入值。 – Kirtan 2009-04-22 14:37:44

回答

4

您需要先創建臨時表(它應該做一次):

CREATE TABLE #TempTable TABLE (
     message VARCHAR(50) 
) 

,那麼問題:

DECLARE @foo INT 
SET @foo = null 

IF (@foo is null) 
    BEGIN 
     INSERT 
     INTO #TempTable 
     SELECT 'foo was null' 
    END 
ELSE 
    BEGIN 
     INSERT 
     INTO #TempTable 
     SELECT 'foo not null' 
    END 

可能不是你想要一個TEMPORARY TABLE,但TABLE VARIABLE(僅在會話期間生活,並且不保留在數據庫模式中):

DECLARE @foo INT 
DECLARE @TempTable TABLE (
     message VARCHAR(50) 
     ) 
SET @foo = null 

IF (@foo is null) 
    BEGIN 
     INSERT 
     INTO @TempTable 
     SELECT 'foo was null' 
    END 
ELSE 
    BEGIN 
     INSERT 
     INTO @TempTable 
     SELECT 'foo not null' 
    END 
+1

是的。但是,在處理大量數據時,它們有時會變慢。 – Kirtan 2009-04-22 14:37:13

+0

這非常好,樂於助人。我很可能會給它接受的答案......但第一部分對我來說不太合適,因爲它將格式從「select..into」更改爲「insert into..select」,這很好,但這意味着我必須手動創建和刪除臨時表。 (當然,這很好......我只想看看後來更新後代的部分內容)。我喜歡第二個答案......我之前沒有使用過表格變量......我必須對它們進行一些研究!好極了! – Beska 2009-04-22 14:41:12

+0

好的更新。你走了。 – Beska 2009-04-22 14:43:38

2

表已經創建好了,你必須先放下它然後再插入它。

編輯:正如你所說,它不是表是在數據庫中已經存在的問題,你可以嘗試做這樣的 -

IF EXISTS (SELECT * FROM sysobjects WHERE object_id = OBJECT_ID(N'#TempTable') 
    DROP TABLE #TempTable 


CREATE TABLE #TempTable (Col1 INT, ...) 

IF TRUE 
BEGIN 
    INSERT INTO #TempTable 
    SELECT VAL1 
END 
ELSE 
BEGIN 
    INSERT INTO #TempTable 
    SELECT VAL2 
END 
1

看看這有助於... link

您必須在選擇語句 之外創建臨時表,然後插入它。例如,

CREATE TABLE #tmp_table AS SELECT * FROM PRODUCTS WHERE 1 = 2

IF @condition = 0 BEGIN INSERT #tmp_table SELECT * FROM 產品.... END ELSE ....

4

SQL正在運行到這個問題,因爲解析步驟注意到有兩個SELECT INTO語句。即使你的邏輯會規定臨時表只會創建一次,解析器仍然會抱怨它。

解決此問題的一種方法是在SELECT INTO之後使用GO語句,但這不適用於條件邏輯。

否則,直接創建表並插入到它像這樣:

CREATE TABLE #TempTable (result varchar(50)) 

IF @foo is null 
BEGIN 
    insert into #TempTable values ('foo was null') 
END 
ELSE 
BEGIN 
    insert into #TempTable values('foo was not null') 
END 
5

爲什麼不使用一組爲主,而不是程序的解決方案:

SELECT CASE WHEN @foo is null 
      THEN 'foo was null' 
      ELSE 'foo not null' 
     END      AS result 
INTO #TempTable