<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
表變數在SQL Server 2000中首次被引入。
表變數的具體定義包括列定義,列名,資料型別和約束。而在表變數中可以使用的約束包括主鍵約束,唯一約束,NULL約束和CHECK約束(外來鍵約束不能在表變數中使用)。
定義表變數的語句是和正常使用Create Table定義表語句的子集。只是表變數通過DECLARE @local_variable語句進行定義。
定義一個表變數,插入一條資料,然後查詢:
DECLARE @tb1 Table ( Id int, Name varchar(20), Age int ) INSERT INTO @tb1 VALUES(1,'劉備',22) SELECT * FROM @tb1
輸出結果如下:
來試試一些不符合要求的情況,例如新增表變數後,新增約束,並對約束命名:
ALTER TABLE @tb1 ADD CONSTRAINT CN_AccountAge CHECK (Account_Age > 18); -- 插入年齡必須大於18
SQL Server提示錯誤如下:
SQL Server不支援定義表變數時對Constraint命名,也不支援定義表變數後,對其建Constraint。
更多的不允許,請檢視下面的要求。
表變數可以在其作用域內像正常的表一樣使用。更確切的說,表變數可以被當成正常的表或者表表示式一樣在SELECT,DELETE,UPDATE,INSERT語句中使用,但是表變數不能在類似"SELECT select_list INTO table_variable"這樣的語句中使用。而在SQL Server2000中,表變數也不能用於INSERT INTO table_variable EXEC stored_procedure這樣的語句中。
在深入臨時表之前,我們要了解一下對談(Session),一個對談僅僅是一個使用者端到資料引擎的連線。在SQL Server Management Studio中,每一個查詢視窗都會和資料庫引擎建立連線。
一個應用程式可以和資料庫建立一個或多個連線,除此之外,應用程式還可能建立連線後一直不釋放知道應用程式結束,也可能使用完釋放連線需要時建立連線。
臨時表和Create Table語句建立的表有著相同的物理工程,但臨時表與正常的表不同之處有:
臨時表既可以通過Create Table語句建立,也可以通過"SELECT <select_list> INTO #table"語句建立。你還可以針對臨時表用"INSERT INTO #table EXEC stored_procedure"這樣的語句。
臨時表可以擁有命名的約束和索引。但是,當兩個使用者在同一時間呼叫同一儲存過程時,將會產生”There is already an object named ‘<objectname>’ in the database”這樣的錯誤。所以最好的做法是不用為建立的物件進行命名,而使用系統分配的在TempDb中唯一的。
如:
1.新建查詢視窗,執行語句:
CREATE TABLE ##temp(RowID int) INSERT INTO ##temp VALUES(3)
2.再次新建一個查詢視窗,每5秒參照一次全域性臨時表
While 1=1 BEGIN SELECT * FROM ##temp WAITFOR delay '00:00:05' END
3.回到第一個視窗,關閉視窗。
4.下一次第二個視窗參照時,將產生錯誤。
微軟推薦使用表變數,如果表中的行數非常小,則使用表變數。
臨時表和表變數有很多類似的地方。所以有時候並沒有具體的細則規定如何選擇哪一個。對任何特定的情況,你都需要考慮其各自優缺點並做一些效能測試。
下面的表格會讓你比較其優略有了更詳細的參考。
特性 | 表變數 | 臨時表 |
---|---|---|
作用域 | 當前批次處理 | 當前對談,巢狀儲存過程, 全域性:所有對談 |
使用場景 | 自定義函數,儲存過程,批次處理 | 自定義函數,儲存過程,批次處理 |
建立方式 | 只能通過DECLEARE語句建立 | CREATE TABLE 語句 SELECT INTO 語句. |
表名長度 | 最多128位元組 | 最多116位元組 |
列型別 | 可以使用自定義資料型別 可以使用XML集合 | 自定義資料型別和XML集合必須在TempDb內定義 |
Collation | 字串排序規則繼承自當前資料庫 | 字串排序規則繼承自TempDb資料庫 |
索引 | 索引必須在表定義時建立 | 索引可以在表建立後建立 |
約束 | PRIMARY KEY, UNIQUE, NULL, CHECK約束可以使用,但必須在表建立時宣告 | PRIMARY KEY, UNIQUE, NULL, CHECK. 約束可以使用,可以在任何時後新增,但不能有外來鍵約束 |
表建立後使用DDL (索引,列) | 不允許 | 允許. |
資料插入方式 | INSERT 語句 (SQL 2000: 不能使用INSERT/EXEC). | INSERT 語句, 包括 INSERT/EXEC. SELECT INTO 語句. |
Insert explicit values into identity columns (SET IDENTITY_INSERT). | 不支援SET IDENTITY_INSERT語句 | 支援SET IDENTITY_INSERT語句 |
Truncate table | 不允許 | 允許 |
解構方式 | 批次處理結束後自動解構 | 顯式呼叫 DROP TABLE 語句. 當前對談結束自動解構 (全域性臨時表: 還包括當其它對談語句不在參照表.) |
事務 | 只會在更新表的時候有事務,持續時間比臨時表短 | 正常的事務長度,比表變數長 |
儲存過程重編譯 | 否 | 會導致重編譯 |
回滾 | 不會被回滾影響 | 會被回滾影響 |
統計資料 | 不建立統計資料,所以所有的估計行數都為1,所以生成執行計劃會不精準 | 建立統計資料,通過實際的行數生成執行計劃。 |
作為引數傳入儲存過程 | 僅僅在SQL Server2008, 並且必須預定義 user-defined table type. | 不允許 |
顯式命名物件 (索引, 約束). | 不允許 | 允許,但是要注意多使用者的問題 |
動態SQL | 必須在動態SQL中定義表變數 | 可以在呼叫動態SQL之前定義臨時表 |
到此這篇關於SQL Server中使用表變數和臨時表的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45