系統暫存資料表和使用者暫存資料表的區別

來源:互聯網
上載者:User
 

  以前在SQL 中寫SP 時,如比較複雜時,喜歡中間使用暫存資料表來暫存相關記錄,這樣的好處有很多,提高效率,提高程式的可讀性等。當然後暫存資料表的使用,一般均會使用使用者暫存資料表, 即 #TempTable, 但有一些情況下,偶爾也會使用系統暫存資料表,即 ##TempTable。

兩種暫存資料表的的使用文法差不多,可用幾種方法來建立,可 Create ,也可 Select Into 。

當然關鍵的是系統暫存資料表和使用者暫存資料表的區別:(如下)
1)使用者暫存資料表:使用者暫存資料表的名稱以單個數字記號(#)開頭;
使用者暫存資料表只對建立這個表的使用者的Session可見,對其他進程是不可見的.
當建立它的進程消失時這個暫存資料表就自動刪除.
2)系統暫存資料表:系統暫存資料表的名稱以數字記號(##)開頭
全域暫存資料表對整個SQL Server執行個體都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.

明白了這些就知道了他們的用途和限制,但有一些地方還是容易出問題,故在此專門列出。

1, 在使用 Exec(SQLScript) 執行Script 時,其間也相當於單專屬一個進程處理,故執行期間內如果建立使用者暫存資料表的話,在執行完成後也就結束了,即執行完成後,你不可以使用在 SQLScript 中產生的使用者暫存資料表,可以用系統暫存資料表代替。

2, 在使用使用者暫存資料表時,有一個問題要注意,就是最好在建立時指定其使用者為 dbo ,以避免可能的問題;

3, 在使用系統暫存資料表時,一定要考慮到,不可以將其用於多使用者使用的環境功能或系統中,否則就可能出現衝突的問題,導致結果不可預料。

如果在多使用者使用的環境中使用系統暫存資料表,則可能會出現多個使用者同時對同一系統暫存資料表進行處理,從而導致衝突和資料的錯誤。以前沒有注意這一點,我就因此而浪費過不少的時間。

有時需要使用Exec(SQLScript)方式產生資料,但其中只能使用系統暫存資料表,如何處理呢?

1, 可以預先定義好一個使用者暫存資料表,然後使用 Insert #TempTable Exec(SQLScript) 的方式,即可將Exec 產生的結果記錄加入使用者暫存資料表,從而避免使用系統暫存資料表;
2, 從根本上避免使用 Exec() ,可用其它方式代替。

Exec() 的使用是因為有一些 Script 比較複雜,其中需要一些組合字元,如 in ('','','') 或其它可能的情況,在此情況,無法直接使用一般的Script 產生記錄,只能先產生一個組合的Script ,然後用Exec 執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.