全局臨時表
回答
發現一個有趣的參考here:
全局臨時表操作很像局部臨時表;它們是在tempdb中創建的,並且比永久表導致的鎖定和日誌記錄更少。但是,它們對所有會話均可見,直到創建會話超出範圍(並且全局## temp表不再被其他會話引用)。如果兩個不同的會話嘗試上面的代碼,如果第一個是仍處於活動狀態,而第二個將獲得以下信息:
服務器:消息2714,級別16,狀態6,第1行 已存在名爲對象「 ##人'在數據庫中。
我還沒有看到使用全局##臨時表的有效理由。如果數據需要堅持到多個用戶,那麼至少對我來說,使用永久表更有意義。通過在自動啓動過程中創建一個全局的## temp表,可以使其更具永久性,但我仍然無法看到這比永久表更有優勢。使用永久性表格,您可以拒絕權限;您無法從全局##臨時表中拒絕用戶。
There is already an object named '##table' in the database.
如果你正在做CREATE TABLE語句這顯然不能爲「##表」已存在於數據庫中,您通常會得到這個錯誤。
在我看來,也許在代碼中的某個時刻,這個全局表的CREATE TABLE邏輯會再次被調用,導致這個錯誤。
是否有導致此錯誤的確切語句的詳細信息?
所以爲什麼部分已經回答了,這裏是如何解決它:
做一次檢查,看看是否臨時表之前創建它的存在:
if object_id('tempdb..##table') is null begin
--create table ##table...
end
我發現了一個很有趣的帖子關於如何檢查從谷歌搜索臨時表的存在http://sqlservercodebook.blogspot.com/2008/03/check-if-temporary-table-exists.html
這是線程安全的嗎?當其他會話正在嘗試執行相同的操作時,如何在第一個會話創建之前創建該表時避免競爭條件? – alpav 2014-02-18 19:18:06
@alpav它不會避免競爭條件,所以如果兩個線程同時創建臨時表,其中一個將失敗。 – 2014-02-28 22:27:41
- 1. oracle全局臨時表
- 2. 全局臨時表創建失敗
- 3. pl/sql創建臨時全局表
- 4. 如何使用Oracle全局臨時表?
- 5. Teradata創建全局臨時表
- 6. intellisense看不到全局臨時表
- 7. 全局臨時表刪除操作
- 8. 全局臨時表併發性
- 9. 全局臨時表回滾源
- 10. ORACLE11全局臨時表的壽命
- 11. oracle中的全局臨時表空間
- 12. 使用與全局臨時表合併
- 13. 全局臨時表中的Microsoft SQL Server
- 14. Oracle - 截斷全局臨時表
- 15. Oracle軟件包全局臨時表
- 16. MS SQL Server - 全局臨時表的安全併發使用?
- 17. 臨時修改全局變量
- 18. 全局臨時表中數據的持續時間?
- 19. 與全局臨時表時,當它們不存在
- 20. 全局臨時表與普通表的性能效率 - oracle 10g
- 21. 修改全局臨時表上的表(保留刪除)
- 22. Oracle全球臨時表
- 23. 全球臨時表Oracle
- 24. MySQL的臨時表是全
- 25. 刪除全球臨時表
- 26. 將數據加載到全局臨時表中
- 27. 使用Oracle.ManagedDataAccess從全局臨時表中讀取
- 28. SQL Server 2012 SSRS:使用全局臨時表創建報告
- 29. 使用全局臨時表可能會妨礙性能?
- 30. Oracle全局臨時表 - 其他實例的權限
RE:「我還沒有看到使用全局##臨時表的有效理由」當我想要使用全局臨時表能夠創造動態SQL中的表並在外部範圍中訪問它。順便說一下,這篇文章傳播了一個古老的神話,即表變量在內存和光盤上的#temp表。在這方面,兩者之間確實沒有多少(任何?)區別。 – 2010-10-08 19:16:27
我認爲不包括第二段,因爲它與問題沒有直接關係。第一段確實討論了Jeevan描述的確切問題。 – 2010-10-08 19:48:27