臨時表與變數表的區別與用法

2021-05-09 10:21:35 字數 3168 閱讀 4047

我們在資料庫中使用表的時候,經常會遇到兩種使用表的方法,分別就是使用臨時表及表變數。在實際使用的時候,我們如何靈活的在儲存過程中運用它們,雖然它們實現的功能基本上是一樣的,可如何在乙個儲存過程中有時候去使用臨時表而不使用表變數,有時候去使用表變數而不使用臨時表呢?

臨時表臨時表與永久表相似,只是它的建立是在tempdb中,它只有在乙個資料庫連線結束後或者由sql命令drop掉,才會消失,否則就會一直存在。臨時表在建立的時候都會產生sql server的系統日誌,雖它們在tempdb中體現,是分配在記憶體中的,它們也支援物理的磁碟,但使用者在指定的磁碟裡看不到檔案。

臨時表分為本地和全域性兩種,本地臨時表的名稱都是以「#」為字首,只有在本地當前的使用者連線中才是可見的,當使用者從例項斷開連線時被刪除。全域性臨時表的名稱都是以「##」為字首,建立後對任何使用者都是可見的,當所有引用該錶的使用者斷開連線時被刪除。

下面我們來看乙個建立臨時表的例子:  

create table dbo.#news

( news_id int not null,

newstitle varchar(100),

newscontent varchar(2000),

newsdatetime datetime

) 臨時表可以建立索引,也可以定義統計資料,所以可以用資料定義語言(ddl)的宣告來阻止臨時表新增的限制,約束,並參照完整性,如主鍵和外來鍵約束。比如來說,我們現在來為#news表字段newsdatetime來新增乙個預設的getdata()當前日期值,並且為news_id新增乙個主鍵,我們就可以使用下面的語句: 

alter table dbo.#news

add

constraint [df_newsdatetime] default (getdate()) for [newsdatetime],

primary key clustered

( [news_id]

) on [primary]

go 臨時表在建立之後可以修改許多已定義的選項,包括:

1)新增、修改、刪除列。例如,列的名稱、長度、資料型別、精度、小數字數以及為空性均可進行修改,只是有一些限制而已。

2)可新增或刪除主鍵和外來鍵約束。

3)可新增或刪除 unique 和 check 約束及 default 定義(物件)。

4)可使用 identity 或 rowguidcol 屬性新增或刪除識別符號列。雖然 rowguidcol 屬性也可新增至現有列或從現有列刪除,但是任何時候在表中只能有一列可具有該屬性。

5)表及表中所選定的列已註冊為全文索引。

表變數表變數建立的語法類似於臨時表,區別就在於建立的時候,必須要為之命名。表變數是變數的一種,表變數也分為本地及全域性的兩種,本地表變數的名稱都是以「@」為字首,只有在本地當前的使用者連線中才可以訪問。全域性的表變數的名稱都是以「@@」為字首,一般都是系統的全域性變數,像我們常用到的,如@@error代表錯誤的號,@@rowcount代表影響的行數。

如我們看看建立表變數的語句:

declare @news table

( news_id int not null,

newstitle varchar(100),

newscontent varchar(2000),

newsdatetime datetime

) 比較臨時表及表變數都可以通過sql的選擇、插入、更新及刪除語句,它們的的不同主要體現在以下這些:

1)表變數是儲存在記憶體中的,當使用者在訪問表變數的時候,sql server是不產生日誌的,而在臨時表中是產生日誌的;

2)在表變數中,是不允許有非聚集索引的;

3)表變數是不允許有default預設值,也不允許有約束;

4)臨時表上的統計資訊是健全而可靠的,但是表變數上的統計資訊是不可靠的;

5)臨時表中是有鎖的機制,而表變數中就沒有鎖的機制。

我們現在來看乙個完整的例子,來看它們的用法的異同:

利用臨時表  

create table dbo.#news

( news_id int not null,

newstitle varchar(100),

newscontent varchar(2000),

newsdatetime datetime

) insert into dbo.#news (news_id, newstitle, newscontent, newsdatetime)

values (1,'bluegreen', 'austen', 200801, getdate())

select news_id, newstitle, newscontent, newsdatetime from dbo.#news

drop table dbo.[#news]

declare @news table

( news_id int not null,

newstitle varchar(100),

newscontent varchar(2000),

newsdatetime datetime

) insert into @news (news_id, newstitle, newscontent, newsdatetime)

values (1,'bluegreen', 'austen', 200801, getdate())

select news_id, newstitle, newscontent, newsdatetime from @news

我們可以看到上面兩種情況實現的是一樣的效果,第一種利用臨時表的時候,臨時表一般被建立後,如果在執行的時候,沒有通過drop table的操作,第二次就不能再被建立,而定義表變數也不需要進行drop table的操作,一次執行完成後就會消失。

其實在選擇臨時表還是表變數的時候,我們大多數情況下在使用的時候都是可以的,但一般我們需要遵循下面這個情況,選擇對應的方式:

1)使用表變數主要需要考慮的就是應用程式對記憶體的壓力,如果**的執行例項很多,就要特別注意記憶體變數對記憶體的消耗。我們對於較小的資料或者是通過計算出來的推薦使用表變數。如果資料的結果比較大,在**中用於臨時計算,在選取的時候沒有什麼分組的聚合,就可以考慮使用表變數。

2)一般對於大的資料結果,或者因為統計出來的資料為了便於更好的優化,我們就推薦使用臨時表,同時還可以建立索引,由於臨時表是存放在tempdb中,一般預設分配的空間很少,需要對tempdb進行調優,增大其儲存的空間。

臨時表與表變數

臨時表 表變數的比較 1 臨時表 臨時表包括 以 開頭的區域性臨時表,以 開頭的全域性臨時表。a 儲存 不管是區域性臨時表,還是全域性臨時表,都會放存放在tempdb資料庫中。b 作用域 區域性臨時表 對當前連線有效,只在建立它的儲存過度 批處理 動態語句中有效,類似於c語言中區域性變數的作用域。全...

表變數與臨時表

什麼情況下使用表變數?什麼情況下使用臨時表?表變數 declare tb table id int identity 1,1 name varchar 100 insert tb select id,name from mytable where name like zhang 臨時表 select...

SQLServer中臨時表與表變數的區別分析

在實際使用的時候,我們如何靈活的在儲存過程中運用它們,雖然它們實現的功能基本上是一樣的,可如何在乙個儲存過程中有時候去使用臨時表而不使用表變數,有時候去使用表變數而不使用臨時表呢?臨時表 臨時表與永久表相似,只是它的建立是在tempdb中,它只有在乙個資料庫連線結束後或者由sql命令drop掉,才會...