1. 程式人生 > 其它 >SQLServer表變數與臨時表

SQLServer表變數與臨時表

表變數

變數都以@或@@為字首,表變數是變數的一種,另外一種變數被稱為標量(可以理解為標準變數,就是標準資料型別的變數,例如整型int或者日期型DateTime)。以@字首的表變數是本地的,因此只有在當前使用者會話中才可以訪問,而@@字首的表變數是全域性的,通常都是系統變數,比如說@@error代表最近的一個T-SQL語句的報錯號。當然因為表變數首先是個變數,因此它只能在一個Batch中生存,也就是我們所說的邊界,超出了這個邊界,表變數也就消亡了。

表變數存放在記憶體中,正是因為這一點所有使用者訪問表變數的時候SQL Server是不需要生成日誌。
————————————————

臨時表

臨時物件都以#或##為字首,臨時表是臨時物件的一種,還有例如臨時儲存過程、臨時函式之類的臨時物件,臨時物件都儲存在系統資料庫的tempdb中。以#字首的臨時表為本地的,因此只有在當前使用者會話中才可以訪問,而##字首的臨時表是全域性的,因此所有使用者會話都可以訪問。臨時表以會話為邊界,只要建立臨時表的會話沒有結束,臨時表就會持續存在,當然使用者在會話中可以通過DROP TABLE命令提前銷燬臨時表。

我們前面說過臨時表儲存在tempdb中,因此臨時表的訪問是有可能造成物理IO的,當然在修改時也需要生成日誌來確保一致性,同時鎖機制也是不可缺少的。

      最近突然想到這個問題,記錄下來鞏固一下自己的知識。

      表,臨時表,表變數,相信很多人都用過,truncate table @表變數 會報錯,相信很多人也遇到過,不過真正去思考為什麼的人可能少之又少,畢竟大多數情況下,我們大部分的人只需要會用,而不需要去知道為什麼,更何況國內的專案總是那麼緊張,本來還有的那點求知慾,可能也會被任務,績效考核衝跑了。

      那到底為什麼表變數不能truncate呢,這就需要了解truncate這個命令的本質,truncate table 是通過釋放儲存表資料所用的資料頁來刪除資料。而表變數的資料是儲存在記憶體中的,而非磁碟中,那麼就truncate table 試圖釋放表變數並不存在的 “資料頁”, 當然會報錯了。

 轉載:https://blog.csdn.net/ChengR666/article/details/120344576