2013-10-29 63 views
6

我有一個存儲過程首先檢查一個臨時表(#temp_table),如果它存在,刪除它,使用表,然後在完成後最後刪除它。當用戶做出某些事情來觸發它時,這個SP會被隨機地調用,並且很可能有時SP會在同一時間執行 - 或者有一些重疊。在MS SQL Server 2005中,當同一個SP的不同執行訪問臨時表時會發生什麼?

假設我有Exec1和Exec2兩個同樣的SP創建,修改和刪除#temp表,並且它們在毫秒內運行。

會發生什麼?執行1結束時,Exec1會鎖定#temp_table和Exec2等待嗎?對我而言,這顯然是可取的。我不希望兩個Exec1 & 2同時使用該表,也不希望Exec2失敗,因爲Exec1已經在使用該表。

[編輯]我應該只是將我的臨時錶轉換爲表變量?

回答

5

在sql server中,如果你創建一個本地臨時表,它帶有一個#號sql server會在後端使用一些低於分數和一些ID。假設您在臨時數據庫中創建名稱爲#Temp sql的臨時表創建一個名稱爲#Temp_______10912098的表,在單獨連接中創建的每個臨時表的名稱末尾都會有它們的ID。


TempTables

這些都是臨時表創建於不同的連接都有名字#Temp但也有一些下劃線附加和unique id SQL Server使用區分它們。

+1

因此,在我的SP中,我有'IF OBJECT_ID('tempdb ..#temp_table')不爲NULL \t DROP TABLE#temp_table' this does nothing nothing then?或者這可能會對其他執行產生不利影響? – jreed121

+2

如果您每次從新會話中調用它(例如從Web應用程序),則不需要這樣做,因爲臨時表的範圍僅限於會話。查看我的答案以獲取更多信息。 –

+3

你不需要像Dommer說的那樣,但是在嘗試創建它之前,它總是一個檢查OBJECT的存在的好習慣。在你的proc中保留這些代碼。 –

4

臨時表#table的範圍僅限於您的會話,所以它不應該是一個問題。

如果您使用##table,那麼這是全球性的,您會遇到問題。

在這裏看到:MSDN SQL Tables

具體該位:

如果數據庫會話創建本地臨時表#employees, 只有會話可以與工作表中,它被刪除時, 會話斷開連接。如果創建全局臨時表 ##employees,則數據庫中的任何用戶都可以使用此表。如果在創建後沒有其他用戶使用此表,則在斷開連接時將刪除表 。如果其他用戶在創建後使用表 ,則在斷開連接後SQL Server會將其刪除,並且在所有其他會話不再有效使用它之後將刪除它。

3

以散列#命名的臨時表特定於單個連接。

因此,如果兩個連接(也稱爲「進程」或「SPID」)通過相同的#tablename引用臨時表,它們實際上將引用不同的表。

如果你看看tempdb,你可以看到這個。將會有多個名爲#748B826C的表格。這些實際上是臨時表變量,如declare @t table (ix int identity primary key)和帶有散列的臨時表名。

所以提供這些是不同的連接,而不是遞歸觸發器,應該沒有問題。

但是,如果您擔心遞歸觸發器的可能性,則應該使用表變量。這些僅限於批處理或存儲過程的範圍。

相關問題