SQL SERVER本地臨時表的可見範圍小探

2021-04-01 17:12:12 字數 1337 閱讀 3017

sql server的臨時表有本地臨時表和全域性臨時表之分,在聯機叢書中這樣描述:

有本地和全域性兩種型別的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字符號 (#) 打頭;它們僅對當前的使用者連線是可見的;當使用者從 microsoft® sql server™ 2000 例項斷開連線時被刪除。全域性臨時表的名稱以數學符號 (##) 打頭,建立後對任何使用者都是可見的,當所有引用該錶的使用者從 sql server 斷開連線時被刪除。

筆者日前所在的專案中使用了本地臨時表,筆者對此做了些探索。由於業務需要,使用者需要非常複雜報表,需要從多個基礎表中用非常複雜的邏輯選取出資料,使用單一的sql邏輯不清晰,會給日後的維護工作帶來困難,因此決定使用sql server提供的本地臨時表。

採用了以下方式:使用dlephi+ado 直接連線資料庫,呼叫儲存過程,在儲存過程中建立臨時表,然後按使用者要求的邏輯抓取基礎資料寫入到臨時表中,最後返回臨時表中的資料集。

程式寫完後,功能都可以實現,並且結果也沒有錯誤,但是筆者產生了懷疑,聯機叢書中說本地臨時表對當前的使用者連線是可見的,但是,筆者的程式是公用乙個ado連線,然後再呼叫儲存過程,在儲存過程中建立了臨時表,這樣說來,這個臨時表是不是在這個連線中全部可見呢?那第二次開啟同一報表,呼叫同一儲存過程的時候是不是會出錯,或者第二次寫入的資料與第一次寫入的資料混雜在一起呢?於是,筆者開始了實驗,在程式中反覆呼叫同一儲存過程,結果發現並沒有問題,既沒有報錯也沒有出現資料混雜的情況,筆者開始疑惑了,難道是聯機叢書寫錯了?然後筆者開始猜想,難得在同一連線中如果反覆建立同名的臨時表,系統會自動重建,於是筆者又做了試驗,在查詢分析器中,反覆建立同名的本地臨時表,發現系統會報錯,從而否定了筆者的猜想。接著,筆者又進行了試驗,在delphi程式中,在乙個按鈕事件中使用create table語句,建立了本地臨時表,在另乙個按鈕事件中呼叫乙個儲存過程,向這個本地臨時表插入資料,再返回資料集,結果發現能夠成功,而同時在查詢分析器中呼叫這個儲存過程就會報沒有這個資料表,這就證明了聯機叢書的描述是對的,確實是當前連線的使用者可見。而後,修改了試驗程式,將create table的語句寫入到儲存過程中,在前台程式的乙個按鈕事件中先呼叫該儲存過程建立臨時表,然後在另乙個按鈕事件中向這個臨時表插入資料並查詢,結果在執行第二個按鈕事件時系統報錯了,說找不到這個資料表,這樣看來,儲存過程中建立的本地臨時表在前台程式中是訪問不到的。

從這些試驗中,筆者得出這樣的結論,在儲存過程中建立的本地臨時表,相當於儲存過程的變數,只在儲存過程內可見,而在前台程式中建立的本地臨時表,就和微軟聯機叢書中所寫的一樣,是對當前的使用者連線可見。了解了這些,可以在不同場合不同需求下使用不同的方法來建立本地臨時表,這樣,會使臨時表發揮它最大的用處。

以上在實際中的點滴經驗,和各位分享,希望能為各位的工作學習提供一點點幫助,另外,不對之處懇請大家指正!

本地臨時表

sql server的臨時表有本地臨時表和全域性臨時表之分,在聯機叢書中這樣描述 有本地和全域性兩種型別的臨時表,二者在名稱 可見性和可用性上均不相同。本地臨時表的名稱以單個數字符號 打頭 它們僅對當前的使用者連線是可見的 當使用者從 microsoft sql server 2000 例項斷開連線...

sqlserver 的臨時表

臨時表有兩種型別 本地和全域性。對於臨時表有如下幾個特點 本地臨時表就是使用者在建立表的時候新增了 字首的表,其特點是根據資料庫連線獨立。只有建立本地臨時表的資料庫連線有表的訪問許可權,其它連線不能訪問該錶 不同的資料庫連線中,建立的本地臨時表雖然 名字 相同,但是這些表之間相互並不存在任何關係 在...

SQLServer 臨時表的使用

臨時表在sqlserver資料庫中,是非常重要的,下面就詳細介紹sql資料庫中臨時表的特點及其使用,僅供參考。臨時表與永久表相似,但臨時表儲存在tempdb中,當不再使用時會自動刪除。臨時表有兩種型別 本地和全域性。它們在名稱 可見性以及可用性上有區別。對於臨時表有如下幾個特點 本地臨時表 本地臨時...