2011-03-07 32 views
1

在SQL Server中,名稱類似於#temp的臨時表具有本地作用域。如果在會話中創建它們,會話中的所有內容都可以看到它們,但不會在會話之外。如果您在存儲過程中創建這樣的表,那麼作用域就是該過程的本地範圍。所以當proc退出時,桌子就消失了。SQL Server中的會話全局臨時表

我所知道的唯一的選擇,就是用表與像##的臨時名稱。這些是暫時的,但在整個服務器範圍內是可見的。所以如果我在會議中創建桌子,隔壁辦公室的鮑勃也會看到他們。

我所尋找的是中間的某個位置,這樣我就可以在存儲過程中創建表,並有連存儲的過程退出後,該表可用於我的會議。我能找到的最近的就是創建只有一個字段的表格,然後在存儲的proc中對其進行修改。雖然這似乎有點混亂。

回答

1

當您啓動會話你能不能創建表,然後執行存儲過程,然後做你想要的存儲過程執行後做表中任何其他?

+0

這就是我提到的kludge。我很可能需要這樣做。 – 2011-03-07 10:36:26

0

我不認爲這是一個開箱即用的SQL Server服務器解決方案。我認爲唯一的辦法是自己管理它。你可以用一些後綴創建一個普通表而不是使用blobal表(你可以通過它的全名來控制它)嗎? 由於全局錶轉到tempdb,這也會幫助您將數據隔離到數據庫中作爲副作用。

2

你會緩存結果在您的客戶端代碼,如果並不意味着數據被持久化或共享。如果它意味着持久或共享,那麼你會使用普通表。

換句話說,從一個結果,並調用透視存儲過程調用應該是無狀態的。如果數據對於會話是私有的,那麼它應該在客戶端中。這避免了使用服務器resourcey這就意味着你不需要保持連接呼叫

之間開這麼說,你可以在連接只使用CONTEXT_INFO用於一個打開的連接上保持數據的少量(128個字節)。

+0

我會分享的一種觀點,但這不是新的代碼。我試圖讓一個大規模的現有報告在更少的...呃...混亂的框架中工作。不幸的是,臨時表必須現在存在,他們可以創建的地方是有限的。我可能需要使用我提到的kludge。 – 2011-03-07 10:37:50

+0

沒什麼不好,然後對不起...... – gbn 2011-03-07 12:16:34

4

另一個雜牌可能爲你工作 - 這取決於許多臨時表是如何這裏涉及。

創建臨時表,作爲真實的表,一個名爲SPID一個額外的列,默認爲@@SPID

然後創建基於@@SPID值訪問這些表的視圖,但過濾器。所有通過這個視圖進行的操作都應該看起來像是按照每個會話進行隔離的。例如:

create table temp_Boris (
    SPID int default @@SPID, 
    ColA int, 
    ColB varchar(10) 
) 
go 
create view vBoris 
as 
    select ColA,ColB from temp_Boris where SPID = @@SPID 
go 

然後,在一個連接,運行以下命令:

insert into vBoris(ColA,ColB) 
select 10,'abc' union all 
select 20,'def' 
go 
select * from vBoris 

,並在另一個連接,運行以下命令:

insert into vBoris(ColA,ColB) 
select 10,'abc' union all 
select 20,'def' 
go 
select * from vBoris 
select * from temp_Boris 
go 
delete from vBoris 
go 
select * from vBoris 
select * from temp_Boris 

,你會看到每個連接能夠把「vBoris」有點像一個臨時表 - 當然,你可能需要添加解決這個(可能更多列)的附加程序來清除舊/過時的結果表。

好吧,我承認,它也感覺很醜。

+0

我已經在其他情況下使用過,但我試圖儘量減少所需的更改。所以爲這個想法+1,但我要與內維爾K的答案。 – 2011-03-09 08:01:35