轉帖一:
暫存資料表與永久表相似,但暫存資料表儲存在 tempdb 中,當不再使用時會自動刪除。
暫存資料表有兩種類型:本地和全域。它們在名稱、可見度以及可用性上有區別。本地暫存資料表的名稱以單個數字記號 (#) 打頭;它們僅對當前的使用者串連是可見的;當使用者從 SQL Server 執行個體中斷連線時被刪除。全域暫存資料表的名稱以兩個數字記號 (##) 打頭,建立後對任何使用者都是可見的,當所有引用該表的使用者從 SQL Server 中斷連線時被刪除。
例如,如果建立了 employees 表,則任何在資料庫中有使用該表的安全許可權的使用者都可以使用該表,除非已將其刪除。如果資料庫會話建立了本地暫存資料表 #employees,則僅會話可以使用該表,會話中斷連線後就將該表刪除。如果建立了 ##employees 全域暫存資料表,則資料庫中的任何使用者均可使用該表。如果該表在您建立後沒有其他使用者使用,則當您中斷連線時該表刪除。如果您建立該表後另一個使用者在使用該表,則 SQL Server 將在您中斷連線並且所有其他會話不再使用該表時將其刪除。
轉帖二:
可以建立本地和全域暫存資料表。本地暫存資料表僅在當前會話中可見;全域暫存資料表在所有會話中都可見。 本地暫存資料表的名稱前面有一個編號符 (#table_name),而全域暫存資料表的名稱前面有兩個編號符 (##table_name)。 SQL 陳述式使用 CREATE TABLE 語句中為 table_name 指定的名稱引用暫存資料表: CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) INSERT INTO #MyTempTable VALUES (1) 如果本地暫存資料表由預存程序建立或由多個使用者同時執行的應用程式建立,則 SQL Server 必須能夠區分由不同使用者建立的表。為此,SQL Server 在內部為每個本地暫存資料表的表名追加一個數字尾碼。儲存在 tempdb 資料庫的sysobjects 表中的暫存資料表,其全名由 CREATE TABLE 語句中指定的表名和系統產生的數字尾碼組成。為了允許追加尾碼,為本地暫存資料表指定的表名 table_name 不能超過 116 個字元。
除非使用 DROP TABLE 語句顯式除去暫存資料表,否則暫存資料表將在退出其範圍時由系統自動除去:
- 當預存程序完成時,將自動除去在預存程序中建立的本地暫存資料表。由建立表的預存程序執行的所有嵌套預存程序都可以引用此表。但調用建立此表的預存程序的進程無法引用此表。
- 所有其它本地暫存資料表在當前會話結束時自動除去。
- 全域暫存資料表在建立此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 陳述式的生存周期內保持。換言之,當建立全域暫存資料表的會話結束時,最後一條引用此表的 Transact-SQL 陳述式完成後,將自動除去此表。
在預存程序或觸發器中建立的本地暫存資料表與在調用預存程序或觸發器之前建立的同名暫存資料表不同。如果查詢引用暫存資料表,而同時有兩個同名的暫存資料表,則不定義針對哪個表解析該查詢。嵌套預存程序同樣可以建立與調用它的預存程序所建立的暫存資料表同名的暫存資料表。嵌套預存程序中對錶名的所有引用都被解釋為是針對該嵌套過程所建立的表,例如:
CREATE PROCEDURE Test2 AS CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (2) SELECT Test2Col = x FROM #t GO CREATE PROCEDURE Test1 AS CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (1) SELECT Test1Col = x FROM #t EXEC Test2 GO CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (99) GO EXEC Test1 GO
下面是結果集:
(1 row(s) affected) Test1Col ----------- 1 (1 row(s) affected) Test2Col ----------- 2
當建立本地或全域暫存資料表時,CREATE TABLE 文法支援除 FOREIGN KEY 約束以外的其它所有約束定義。如果在暫存資料表中指定 FOREIGN KEY 約束,該語句將返回警告資訊,指出此約束已被忽略,表仍會建立,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用暫存資料表。
考慮使用表變數而不使用暫存資料表。當需要在暫存資料表上顯式地建立索引時,或多個預存程序或函數需要使用表值時,暫存資料表很有用。通常,表變數提供更有效查詢處理。