初識臨時表

2022-02-23 01:34:26 字數 4439 閱讀 6979

臨時表就是那些名稱以井號 (#) 開頭的表。如果當使用者斷開連線時沒有除去臨時表,sql server 將自動除去臨時表。臨時表不儲存在當前資料庫內,而是儲存在系統資料庫 tempdb 內。 

建立臨時表有多種方法。其一,先建立表結構,跟建立普通表一樣,只是表名多了個#號

create table #tmp

(id

int,

name varchar(50)

)

有了表結構就可以給表新增資料,新增資料的方法,同普通表一樣。

其二,建立表同時插入資料 

select *  int #tmp from table_name  //

table_name 為資料庫中的普通表,在建立#tmp的時候自動將table_name 中的資料填充到#tmp臨時表中

既然建立了表,我們就會聯想到怎麼刪除表……同樣有兩種途徑。其一,手動刪除(drop table #tmp)。其二,當連線斷開時,系統自動清除臨時表。

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

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

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

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

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

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

在此,我用臨時表做過的例子就是防止使用者重複登入

在我們開發商務軟體的時候,常常會遇到這樣的乙個問題:怎樣防止使用者重複登入我們的系統?特別是對於銀行或是財務部門,更是要限制使用者以其工號身份多次登入。

可能會有人說在使用者資訊表中加一欄位判斷使用者工號登入的狀態,登入後寫1,退出時寫0,且登入時判斷其標誌位是否為1,如是則不讓該使用者工號登入。但是這樣那勢必會帶來新的問題:如發生象斷電之類不可預知的現象,系統是非正常退出,無法將標誌位置為0,那麼下次以該使用者工號登入則不可登入.

create procedure gp_findtemptable 

/*尋找以操作員工號命名的全域性臨時表  

* 如無則將out引數置為0並建立該錶,如有則將out引數置為1  

* 在connection斷開連線後,全域性臨時表會被sql server自動**   

* 如發生斷電之類的意外,全域性臨時表雖然還存在於tempdb中,但是已經失去活性  

* 用object_id函式去判斷時會認為其不存在.

*/@v_userid varchar(

6), --操作員工號

@i_out

intout -- 輸出引數 0:沒有登入 1

:已經登入

asdeclare @v_sql varchar(

100)

if object_id('

tempdb.dbo.##

'+@v_userid) is

null

begin

set @v_sql = '

create table ##

'+@v_userid+'

(userid varchar(6))

'exec (@v_sql)

set @i_out = 0

end  

else

set @i_out = 1

在這個過程中,我們看到如果以使用者工號命名的全域性臨時表不存在時過程會去建立一張並把out引數置為0,如果已經存在則將out引數置為1。

上面還涉及到乙個object_id ()函式:

syntax:

object_id ( '[ database_name . [ schema_name ] . | schema_name . object_name' [ ,'object_type' ] )

一般語法:int object_id('objectname');

此方法返回資料庫物件標識號。

其中,引數objectname 表示要使用的物件,其資料型別為nchar或char(如果為char,系統將其轉換為nchar)

object_type:為可選引數,其資料型別為nchar或char(如果為char,系統將其轉換為nchar),指明架構範圍的物件型別(object_name為字串通過它,可以說明這個字串究竟是說明物件,其列表見文章結尾)

ps:使用

object_id 

不能查詢非架構範圍內的物件(如

ddl 

觸發器)。對於在

sys.objects 

目錄檢視中找不到的物件,需要通過查詢適當的目錄檢視來獲取該物件的標識號。例如,若要返回

ddl 

觸發器的物件標識號,請使用

select object_id from sys.triggers where name = 'databasetriggerlog'

。返回型別為int,表示該物件在系統中的編號,如果找不到或發生錯誤一律返回null。

例子:a.返回資料庫adventureworks中production.workorder表的標識號

usemaster;

goselect

object_id(n'

adventureworks.production.workorder') 

as'object id';

gob.存在性檢查

下列會確認資料表有物件的標識碼,藉此檢查指定的資料表是否存在。如果存在就刪除。

useadventureworks;

goif

object_id(n'

dbo.awbuildversion

', n'u

') isnot

null

drop

table

dbo.awbuildversion;

go此方法一般用來判斷資料庫中本來用沒有此物件(procedures,views,functions等).

注意:

當該引數對系統函式可選時,則系統採用當前資料庫、主機、伺服器使用者或資料庫使用者。內建函式後面必須跟圓括號。 

如果指定乙個臨時表名,除非當前資料庫為tempdb(廢話),否則必須在臨時表名前面加上資料庫名,例如: 

select object_id('tempdb..#mytemptable')

object_type列表:

af = 

聚合函式

(clr)

c = check 

約束d = default

(約束或獨立)

f = foreign key 

約束fn = sql 

標量函式

fs = 

程式集(clr) 

標量函式

ft = 

程式集(clr) 

錶值函式

if = sql 

內聯錶值函式

it = 

內部表p = sql 

儲存過程

pc = 

程式集(clr) 

儲存過程

pg = 

計畫指南

pk = primary key 

約束r = 

規則(舊式,獨立)

rf = 

複製篩選過程

s = 

系統基表

sn = 

同義詞sq = 

服務佇列

ta = 

程式集(clr) dml 

觸發器tf = sql 

錶值函式

tr = sql dml 

觸發器u = 

表(使用者定義型別)

uq = unique 

約束v = 

檢視x = 

擴充套件儲存過程

36 臨時表和臨時表

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

mysql臨時表更新 MySql 臨時表

今天在專案中遇到乙個,當mysql的in語句中資料量很大時,建立乙個臨時表的例子。於是樓主整理了一下關於臨時表的知識,與大家分享一下 首先,臨時表只在當前連線可見,當關閉連線時,mysql會自動刪除表並釋放所有空間。因此在不同的連線中可以建立同名的臨時表,並且操作屬於本連線的臨時表。建立臨時表 cr...

mysql 臨時表 限制 Mysql臨時表

當你建立臨時表的時候,你可以使用temporary關鍵字。如 create temporary table tmp table name varchar 10 not null,passwd char 6 not null 或create temporary table if not exists ...