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

字號(hào):

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