SQL臨時表和永久表

2021-08-31 05:28:02 字數 3497 閱讀 5433

臨時表與永久表相似,但臨時表儲存在 tempdb 中,當不再使用時會自動刪除。

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

例如,如果建立了 employees 表,則任何在資料庫中有使用該錶的安全許可權的使用者都可以使用該錶,除非已將其刪除。如果資料庫會話建立了本地臨時表 #employees,則僅會話可以使用該錶,會話斷開連線後就將該錶刪除。如果建立了 ##employees 全域性臨時表,則資料庫中的任何使用者均可使用該錶。如果該錶在您建立後沒有其他使用者使用,則當您斷開連線時該錶刪除。如果您建立該錶後另乙個使用者在使用該 表,則 sql server 將在您斷開連線並且所有其他會話不再使用該錶時將其刪除。

1、區域性臨時表(#開頭)只對當前連線有效,當前連線斷開時自動刪除。   

2、全域性臨時表(##開頭)對其它連線也有效,在當前連線和其他訪問過它的連線都斷開時自動刪除。   

3、不管區域性臨時表還是全域性臨時表,只要連線有訪問許可權,都可以用drop table #tmp(或者drop table ##tmp)來顯式刪除臨時表。   

使用全域性臨時表需要加上   

if object_id('tempdb..##臨時表') is not null

drop table ##臨時表

else

creeate table ##臨時表..

sql server臨時表的使用

drop table #tmp   --刪除臨時表#tmp

create table #tmp --建立臨時表#tmp

(id   int identity (1,1)     not null, --建立列id,並且每次新增一條記錄就會加1

wokno                varchar(50),  

primary key (id)      --定義id為臨時表#tmp的主鍵     

);select * from #tmp    --查詢臨時表的資料

truncate table #tmp --清空臨時表的所有資料和約束

declare @wokno varchar(500) --用來記錄職工號

declare @str nvarchar(4000) --用來存放查詢語句

declare @count int --求出總記錄數     

declare @i int

set @i = 0

select @count = count(distinct(wokno)) from #tmp

while @i < @count

begin

set @str = 'select top 1 @wokno = wokno from #tmp where id not in (select top ' + str(@i) + 'id from #tmp)'

exec sp_executesql @str,n'@wokno varchar(500) output',@wokno output

select @wokno,@i --一行一行把職工號顯示出來

set @i = @i + 1

end臨時表

可以建立本地和全域性臨時表。本地臨時表僅在當前會話中可見;全域性臨時表在所有會話中都可見。

本地臨時表的名稱前面有乙個編號符 (#table_name),而全域性臨時表的名稱前面有兩個編號符 (##table_name)。

sql 語句使用 create table 語句中為 table_name 指定的名稱引用臨時表:

create table #mytemptable (cola int primary key)

insert into #mytemptable values (1)

如果本地臨時表由儲存過程建立或由多個使用者同時執行的應用程式建立,則 sql server 必須能夠區分由不同使用者建立的表。為此,sql server 在內部為每個本地臨時表的表名追加乙個數字字尾。儲存在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由 create table 語句中指定的表名和系統生成的數字字尾組成。為了允許追加字尾,為本地臨時表指定的表名 table_name 不能超過 116 個字元。

除非使用 drop table 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:

當儲存過程完成時,將自動除去在儲存過程中建立的本地臨時表。由建立表的儲存過程執行的所有巢狀儲存過程都可以引用此表。但呼叫建立此表的儲存過程的程序無法引用此表。

所有其它本地臨時表在當前會話結束時自動除去。

全域性臨時表在建立此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 transact-sql 語句的生存週期內保持。換言之,當建立全域性臨時表的會話結束時,最後一條引用此表的 transact-sql 語句完成後,將自動除去此表。

在 儲存過程或觸發器中建立的本地臨時表與在呼叫儲存過程或觸發器之前建立的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪 個表解析該查詢。巢狀儲存過程同樣可以建立與呼叫它的儲存過程所建立的臨時表同名的臨時表。巢狀儲存過程中對錶名的所有引用都被解釋為是針對該巢狀過程所 建立的表,例如:

create procedure test2

ascreate table #t(x int primary key)

insert into #t values (2)

select test2col = x from #t

gocreate procedure test1

ascreate table #t(x int primary key)

insert into #t values (1)

select test1col = x from #t

exec test2

gocreate table #t(x int primary key)

insert into #t values (99)

goexec test1

go下面是結果集:

(1 row(s) affected)

test1col   

-----------

1          

(1 row(s) affected)

test2col   

-----------

2          

當建立本地或全域性臨時表時,create table 語法支援除 foreign key 約束以外的其它所有約束定義。如果在臨時表中指定 foreign key 約束,該語句將返回警告資訊,指出此約束已被忽略,表仍會建立,但不具有 foreign key 約束。在 foreign key 約束中不能引用臨時表。

考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地建立索引時,或多個儲存過程或函式需要使用錶值時,臨時表很有用。通常,表變數提供更有效的查詢處理。

SQL 表變數和臨時表

sql 表變數和臨時表 表變數 儲存在記憶體中,作用域是指令碼的執行過程中,指令碼執行完畢之後就會釋放記憶體,適合短時間內儲存資料量小的資料集。優點 使用靈活,使用完之後立即釋放,不占用物理儲存空間 缺點 只適合較小資料量的暫時儲存,不能建索引,資料量稍大時查詢效率慢,佔記憶體 使用臨時表和表變數的...

SQL臨時表和表變數

表變數 儲存在記憶體中,作用域是指令碼的執行過程中,指令碼執行完畢之後就會釋放記憶體,適合短時間內儲存資料量小的資料集。優點 使用靈活,使用完之後立即釋放,不占用物理儲存空間 缺點 只適合較小資料量的暫時儲存,不能建索引 資料量稍大時查詢效率慢,佔記憶體 使用臨時表和表變數的資料量大小沒有具體的臨界...

36 臨時表和臨時表

臨時表特點 建表語法是create temporary table乙個臨時表只能被建立它的session訪問,對其他執行緒不可見。臨時表和普通表可以同名。同乙個session內有臨時表和普通表的時候,show crete語句 增刪改查訪問的是臨時表。show tabls命令不顯示臨時表。由於臨時表只...