SQLServer 臨時表的使用

2021-08-18 02:53:08 字數 3070 閱讀 9932

臨時表在sqlserver資料庫中,是非常重要的,下面就詳細介紹sql資料庫中臨時表的特點及其使用,僅供參考。

臨時表與永久表相似,但臨時表儲存在tempdb中,當不再使用時會自動刪除。臨時表有兩種型別:本地和全域性。它們在名稱、可見性以及可用性上有區別。

對於臨時表有如下幾個特點:

本地臨時表

本地臨時表的名稱以單個數字符號 (#) 打頭;它們僅對當前的使用者連線(也就是建立本地臨時表的connection)是可見的;當使用者從 sql server 例項斷開連線時被刪除。

例如我們在乙個資料庫連線中用如下語句建立本地臨時表#temp

資料庫連線1:

create

table #temp

( id

int,

customer_name

nvarchar(50),

age

int)

然後同時啟動資料庫連線2,執行查詢#temp的操作

資料庫連線2:

select

*from #temp

我們來看看資料庫連線2的結果是什麼?

資料庫連線2:

結果顯示,資料庫連線2找不到表#temp。這說明#temp這張臨時表,只是對建立它的資料庫連線1可見,而對於資料庫連線2來說是不可見的。

全域性臨時表

全域性臨時表的名稱以兩個數字符號 (##) 打頭,建立後對任何資料庫連線都是可見的,當所有引用該錶的資料庫連線從 sql server 斷開時被刪除。

例如我們在乙個資料庫連線中用如下語句建立全域性臨時表##temp,然後插入三行資料

資料庫連線1:

create

table ##temp

( id

int,

customer_name

nvarchar(50),

age

int)

insert

into ##temp

values(1,'

老王',20),(2,'

老張',30),(3,'

老李',25)

接著我們在資料庫連線2中,查詢##temp的資料

資料庫連線2:

select

*from ##temp

資料庫連線2結果如下

資料庫連線2:

可以看到,資料庫連線2可以成功訪問到資料庫連線1建立的全域性臨時表##temp,但是如果我們現在關閉資料連線1,然後再執行資料庫連線2的##temp查詢語句會發生什麼呢?結果如下:

關閉資料庫連線1,然後資料庫連線2再次執行:

我們發現關閉資料庫連線1後,資料庫連線2就找不到全域性臨時表##temp了。這是因為資料庫連線1被關閉後,資料庫連線2此時也沒有語句正在使用臨時表##temp,所以sqlserver認為此時已經沒有資料庫連線在引用全域性臨時表##temp了,就將##temp釋放掉了。

接下來,我們嘗試在資料庫連線2中對全域性臨時表##temp持有事務中的排他鎖(x鎖)後,然後關閉資料庫連線1.

資料庫連線1:

create

table ##temp

( id

int,

customer_name

nvarchar(50),

age

int)

insert

into ##temp

values(1,'

老王',20),(2,'

老張',30),(3,'

老李',25)

資料庫連線2:

begin

tran

select

*from ##temp

with(xlock)

關閉資料庫連線1,然後資料庫連線2執行:

結果顯示我們儘管關閉了資料庫連線1,但是由於資料庫連線2在事務中一直持有全域性臨時表##temp的排他鎖(x鎖),所以臨時表##temp並沒有隨著資料庫連線1的關閉而被釋放掉,只要資料庫連線2中啟動的事務沒有被回滾或提交,那麼資料庫連線2會一直持有臨時表##temp的排他鎖,這時sqlserver會認為還有資料庫連線正在引用全域性臨時表##temp,所以##temp不會被釋放掉。

查詢資料並寫入臨時表:

select * into #tab from table;

刪除臨時表:

drop table #tab;

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的主鍵 ...

sqlserver 的臨時表

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

sqlserver 臨時表使用方法

建立臨時表 create procedure sp a try tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 as declare strsql nvarchar 4000 主語句 declare strtmp varchar 110...