Sql-Server
可以跨會話共享臨時表嗎?
我已經修改了一個建構動態 SQL 語句以創建和填充臨時表的過程。語法是這樣的:
...'create #temp_' + CAST(GETGUID() AS VARCHAR(36)) ...
我問一位同事是否知道為什麼要將唯一標識符連接到表名。他告訴我,過去有一些臨時表在會話之間共享並且數據混亂的情況。
我知道這是不可能的,因為 MSDN 明確指出:
您可以創建本地和全域臨時表。本地臨時表只在目前會話中可見,全域臨時表對所有會話可見。
現在(記住案例)一些同事認為我們應該使用上面的語法作為一個好的做法,但我不喜歡它並且需要證明沒有這樣的錯誤或者它是否已經修復。
有 SQL Server 2005/2008 經驗的人能告訴我是否有過這種情況嗎?
本地表不應該跨會話共享。正如您所指出的,它們僅對創建它們的會話可見,並在創建會話終止或刪除它們時被銷毀。
全域臨時變數對所有會話都是可見的,但您需要使用雙雜湊定義它們,即
##temp
,將它們定義為全域變數。至於在創建表名時為表名加上後綴,那是在浪費時間,因為 SQL Server 無論如何都會這樣做。
CREATE TABLE #temp (Name VARCHAR(20)); USE tempdb; GO SELECT name FROM sys.tables WHERE name LIKE '#temp%';
對我來說,這返回
#temp_______________________________________________________________________________________________________________00000000004C
然而,正如 Aaron Bertrand 在這個答案中指出的那樣:
如果您將所有內容都稱為#temp、#t 或#x,那麼在呼叫該過程之前,可能在外部範圍內已經存在這樣的表。
在這種情況下,您可以在頂級程序和它在該程序中呼叫的許多不同過程之間共享臨時表。這當然可能導致數據損壞,具體取決於您定義和建構臨時表的方式。