2011-08-22 79 views
5

我正嘗試通過將多個查詢合併到一個結果集中來爲Crystal Reports編寫存儲過程(Crystal不支持在一個報告中使用多個結果)。如何正確SELECT INTO @TempTable多次返回單個結果集?

我試圖從兩個表中結合列的結果集。

在SP中,我聲明@temptable和列(因爲我查詢的兩個表有不同的列)。

DECLARE @TEMPNEWBILLING TABLE 
(
    ACCOUNT DECIMAL null, 
    CLIENT NVARCHAR null, 
    TIMESTAMP INT null, 
    BILLING DECIMAL null, 
    CALLKIND INT null, 
    HITK1 DECIMAL null, 
    HITK2 DECIMAL null, 
    HIDISC DECIMAL null, 
    HITALK DECIMAL null, 
    HIPTCH DECIMAL null, 
    HICONF DECIMAL null, 
    HIHOLD DECIMAL null, 
    PTCH DECIMAL null, 
    SUPERTIME DECIMAL null 
) 

然後我SELECT兩個表INTO臨時表:

SELECT Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,  HiConf, HiHold, Ptch 
INTO TEMPNEWBILLING 
FROM 
     mCallEnd 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 
    AND CallKind in (0,1,2,3,4,16) 

SELECT 
    Billing, SuperTime 
INTO TEMPNEWBILLING 
FROM 
     mClientMaint 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 

最後,我剛剛得到從臨時表中的所有數據。

SELECT * FROM @TEMPNEWBILLING 

不幸的是,事情錯了,因爲當我運行的SP,我得到一個錯誤,

中已存在的數據庫名爲「TEMPNEWBILLING」的對象。

我檢查過它,它似乎是第一個查詢正在運行,但錯誤被拋出在第二個Select Into。我必須這樣做是錯誤的,因爲如果我使用#表或@表(即刪除表格與創建表格),我會得到相同的錯誤。

用兩個查詢的結果填充臨時表的前景根本不可能嗎?我是否使用錯誤的工具來完成這項工作?

回答

11

在您的代碼中,您沒有使用您定義的變量表,而是嘗試將結果放入同一個物理表中。試試這個:

INSERT INTO @TEMPNEWBILLING(Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,  HiConf, HiHold, Ptch) 
SELECT Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,  HiConf, HiHold, Ptch 
FROM 
     mCallEnd 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 
    AND CallKind in (0,1,2,3,4,16) 

INSERT INTO @TEMPNEWBILLING(Billing, SuperTime) 
SELECT 
    Billing, SuperTime 
FROM 
     mClientMaint 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 
4

一旦表格已經創建,您需要使用INSERT。另外,你正在使用一個表變量,所以你需要在引用它時在名字的開頭加入@。由於您在開始時聲明瞭表變量,因此這兩個語句實際上應該是INSERT而不是SELECT INTO

SELECT INTO試圖創建一個新表。在你的代碼中,你基本上聲明瞭一個表變量(永遠不會被使用),那麼你的第一個SELECT INTO創建一個名字爲TEMPNEWBILLING的永久表,然後你的第二個SELECT INTO嘗試創建一個具有相同確切名稱的表 - 因此是錯誤。

9

SELECT ... INTO創建一個新表。

你要扭轉這種局面:

INSERT INTO @TEMPNEWBILLING 
(Columns...) 
SELECT (your select query here) 

你要申報表(在技術上它是一個表變量,因爲你正在使用的@符號)爲你做。然後對所有插入使用INSERT INTO ... SELECT ...。