SQL中系統(tǒng)臨時表的使用和禁忌及Exec(SQLScript)的使用

字號:

以前在SQL 中寫SP 時,如比較復(fù)雜時,喜歡中間使用臨時表來暫存相關(guān)記錄,這樣的好處有很多,提高效率,提高程序的可讀性等。當然后臨時表的使用,一般均會使用用戶臨時表,即 #TempTable, 但有一些情況下,偶爾也會使用系統(tǒng)臨時表,即 ##TempTable。
    兩種臨時表的的使用語法差不多,可用幾種方法來建立,可 Create ,也可 Select Into 。
    當然關(guān)鍵的是系統(tǒng)臨時表和用戶臨時表的區(qū)別:(如下)
    1)用戶臨時表:用戶臨時表的名稱以單個數(shù)字符號(#)開頭;
    用戶臨時表只對創(chuàng)建這個表的用戶的Session可見,對其他進程是不可見的.
    當創(chuàng)建它的進程消失時這個臨時表就自動刪除.
    2)系統(tǒng)臨時表:系統(tǒng)臨時表的名稱以數(shù)字符號(##)開頭
    全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.
    明白了這些就知道了他們的用途和限制,但有一些地方還是容易出問題,故在此專門列出。
    1, 在使用 Exec(SQLScript) 執(zhí)行Script 時,其間也相當于單獨有一個進程處理,故執(zhí)行期間內(nèi)如果創(chuàng)建用戶臨時表的話,在執(zhí)行完成后也就結(jié)束了,即執(zhí)行完成后,你不可以使用在 SQLScript 中生成的用戶臨時表,可以用系統(tǒng)臨時表代替。
    2, 在使用用戶臨時表時,有一個問題要注意,就是在建立時指定其用戶為 dbo ,以避免可能的問題;
    3, 在使用系統(tǒng)臨時表時,一定要考慮到,不可以將其用于多用戶使用的環(huán)境功能或系統(tǒng)中,否則就可能出現(xiàn)沖突的問題,導(dǎo)致結(jié)果不可預(yù)料。
    如果在多用戶使用的環(huán)境中使用系統(tǒng)臨時表,則可能會出現(xiàn)多個用戶同時對同一系統(tǒng)臨時表進行處理,從而導(dǎo)致沖突和數(shù)據(jù)的錯誤。以前沒有注意這一點,我就因此而浪費過不少的時間。
    有時需要使用Exec(SQLScript)方式產(chǎn)生數(shù)據(jù),但其中只能使用系統(tǒng)臨時表,如何處理呢?
    1, 考試大提示可以預(yù)先定義好一個用戶臨時表,然后使用 Insert #TempTable Exec(SQLScript) 的方式,即可將Exec 產(chǎn)生的結(jié)果記錄加入用戶臨時表,從而避免使用系統(tǒng)臨時表;
    2, 從根本上避免使用 Exec() ,可用其它方式代替。
    Exec() 的使用是因為有一些 Script 比較復(fù)雜,其中需要一些組合字符,如 in ('','','') 或其它可能的情況,在此情況,無法直接使用一般的Script 產(chǎn)生記錄,只能先產(chǎn)生一個組合的Script ,然后用Exec 執(zhí)行。