2016-03-01 107 views
1

我有一個報告將觸發SQL Server上的存儲過程。報告需要幾分鐘才能運行。目前,在開發環境中使用我這種類型的代碼正在寫一對夫婦臨時表:在開發環境處理多個用戶同時創建臨時表

SELECT * 
INTO #Temp1 
FROM MyTable 
WHERE MyVal = 'X' 

SELECT * 
INTO #Temp2 
FROM MyOtherTable 
WHERE MyOtherVal = 'Y' 

ETC... 

工作正常,但有一個輕微的可能性有一天兩個人可能用兩個不同的參數同時啓動此功能。如果他們這樣做,會導致一個#Temp被覆蓋?如果是這樣,處理這個問題的最好方法是什麼?你能創建一個#Temp文件名基於時間戳或什麼的?

+11

不,您創建的臨時表的創建方式是特定於會話的。多個用戶不會互相干擾。 – jradich1234

+2

如果臨時表以#開頭,則該用戶特定。如果你在開始時給它一個##,那麼它對所有用戶都是全球的。 – PulseLab

+0

謝謝,夥計們!這些是自學成才的陷阱,但我一直在學習! –

回答

0

我第一次使用臨時表,我想知道同樣的事情。在SQL服務器上試試這個實驗。在SSMS中,運行以下每個查詢並觀察結果:

USE tempdb 
GO 

select * from sys.tables 

SELECT * INTO #tablelist 
FROM sys.tables 

SELECT * INTO #tablelist2 
FROM sys.tables 

-- The results of these two are different 
SELECT * FROM #tablelist 
SELECT * FROM #tablelist2 

查看第二個查詢中的表列表。您會注意到名爲#tablelist_______ ... ____00007#tablelist______ ... ____00008的兩個表。
這是SQL服務器如何避免名稱衝突。它實際創建的表具有類似於臨時表名稱的名稱,但在末尾具有序列號,以避免名稱衝突。它會自動爲您處理。