2012-09-07 85 views
2

我有通過使用CONTAINSTABLE像發現索引創建臨時表的存儲過程(I把一塊存儲的過程代碼):存儲過程創建的臨時表可能用於另一個存儲過程嗎?

CREATE TABLE #tmpTable(
    ID INT, 
    RANK INT) 

SELECT @query = ' 
    SELECT 
    DISTINCT ID AS T_ID, 
    indexTable.RANK AS RANK 
    FROM 
    MyTable 
    INNER JOIN 
    CONTAINSTABLE(MyTable, (*), "ISABOUT('example*')") AS indexTable 
    ON 
    MyTable.ID = indexTable.[KEY] 
    ORDER BY RANK DESC' 

我想使用,如果是可能的話,臨時表進另一個存儲過程將其值用於其他目的,並避免做兩次相同的事情。

如果不可能,那麼你能否告訴我在不同的存儲過程中重用表數據的最佳方式。另外,我知道我不能在存儲過程中創建視圖,那麼視圖就沒有了討論。

回答

4

使用全局臨時表

CREATE TABLE ##tmpTable(
    ID INT, 
    RANK INT) 

您可以通過使用雙散列(##)

前綴表的名稱一旦這個表已經被連接創建的,像創建一個全局臨時表永久表,然後通過任何連接可供任何用戶使用。它只能在所有連接關閉後才能刪除。

編輯:

爲了檢查你可以用下面的語句/支票的臨時表的存在。

if object_id('tempdb..##tmpTable') is not null 
begin 
    drop table ##tmpTable 
end 
+0

然後,存儲過程創建的表在執行結束時不會被刪除? –

+0

+1,也許還可以告訴OP在全局/本地臨時表和表變量之間的區別。 –

+0

@SnakeEyes:不,你可以在另一個程序中使用它 –

2

如果調用第二個存儲過程的第一個存儲過程,第二個過程可以訪問第一個創建了任何臨時表:

create procedure SP_1 
as 
    create table #T1 (ID int not null) 
    insert into #T1 (ID) values (1),(2) 

    exec SP_2 
go 
create procedure SP_2 
as 
    select * from #T1 
go 
exec SP_1 

產生兩個行。但是,我不確定這是否是您想要做的 - 您的示例僅定義了臨時表並且從不訪問它。

+0

這兩個存儲過程在它們之間沒有鏈接。但很高興知道。 –

0

有兩種類型的臨時表a)臨時表和b)全局臨時表。

全局臨時表(使用##聲明,如##globalTempTable)可用於所有過程。

可以在嵌套過程中使用普通臨時表(聲明爲#,如#temptale)。如果零件sp_A調用另一個零件sp_B,則在sp_A中聲明的臨時表也將在sp_B中可用。

相關問題