婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQL Server 表變量和臨時表的區(qū)別(詳細補充篇)

SQL Server 表變量和臨時表的區(qū)別(詳細補充篇)

熱門標簽:地圖標注跑線下市場 地圖標注可以編輯地名嗎 南通智能外呼系統(tǒng)怎么樣 臺灣外呼系統(tǒng)軟件 南京怎么申請400這種電話 樂昌電話機器人 真3地圖標注 濮陽清豐400開頭的電話申請 疫情時期電話機器人

一、表變量

  表變量在SQL Server 2000中首次被引入。表變量的具體定義包括列定義,列名,數據類型和約束。而在表變量中可以使用的約束包括主鍵約束,唯一約束,NULL約束和CHECK約束(外鍵約束不能在表變量中使用)。定義表變量的語句是和正常使用Create Table定義表語句的子集。只是表變量通過DECLARE @local_variable語句進行定義。

  表變量的特征:
1.表變量擁有特定作用域(在當前批處理語句中,但不在任何當前批處理語句調用的存儲過程和函數中),表變量在批處理結束后自動被清除。
2.表變量較臨時表產生更少的存儲過程重編譯。
3.針對表變量的事務僅僅在更新數據時生效,所以鎖和日志產生的數量會更少。
4.由于表變量的作用域如此之小,而且不屬于數據庫的持久部分,所以事務回滾不會影響表變量。

  表變量可以在其作用域內像正常的表一樣使用。更確切的說,表變量可以被當成正常的表或者表表達式一樣在SELECT,DELETE,UPDATE,INSERT語句中使用,但是表變量不能在類似"SELECT select_list INTO table_variable"這樣的語句中使用。而在SQL Server2000中,表變量也不能用于INSERT INTO table_variable EXEC stored_procedure這樣的語句中。

  表變量不能做如下事情:
1.雖然表變量是一個變量,但是其不能賦值給另一個變量。
2.check約束,默認值和計算列不能引用自定義函數。
3.不能為約束命名。
4.不能Truncate表變量。
5.不能向標識列中插入顯式值(也就是說表變量不支持SET IDENTITY_INSERT ON)

   下面來玩玩表變量吧。

  定義一個表變量,插入一條數據,然后查詢:

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。

  更多的不允許,請查看上面的要求。

二、臨時表

在深入臨時表之前,我們要了解一下會話(Session),一個會話僅僅是一個客戶端到數據引擎的連接。在SQL Server Management Studio中,每一個查詢窗口都會和數據庫引擎建立連接。一個應用程序可以和數據庫建立一個或多個連接,除此之外,應用程序還可能建立連接后一直不釋放知道應用程序結束,也可能使用完釋放連接需要時建立連接。

  臨時表和Create Table語句創(chuàng)建的表有著相同的物理工程,但臨時表與正常的表不同之處有:

  1、臨時表的名稱不能超過116個字符,這是由于數據庫引擎為了辨別不同會話建立不同的臨時表,所以會自動在臨時表的名字后附加一串。

  2、局部臨時表(以"#"開頭命名的)作用域僅僅在當前的連接內,從在存儲過程中建立局部臨時表的角度來看,局部臨時表會在下列情況下被Drop:
    a、顯示調用Drop Table語句
    b、當局部臨時表在存儲過程內被創(chuàng)建時,存儲過程結束也就意味著局部臨時表被Drop。
    c、當前會話結束,在會話內創(chuàng)建的所有局部臨時表都會被Drop。

  3、全局臨時表(以"##"開頭命名的)在所有的會話內可見,所以在創(chuàng)建全局臨時表之前首先檢查其是否存在,否則如果已經存在,你將會得到重復創(chuàng)建對象的錯誤。
    a、全局臨時表會在創(chuàng)建其的會話結束后被Drop,Drop后其他會話將不能對全局臨時表進行引用。
    b、引用是在語句級別進行,如:
      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.下一次第二個窗口引用時,將產生錯誤。

4、不能對臨時表進行分區(qū)。
5、不能對臨時表加外鍵約束。
6、臨時表內列的數據類型不能定義成沒有在TempDb中沒有定義自定義數據類型(自定義數據類型是數據庫級別的對象,而臨時表屬于TempDb)。由于TempDb在每次SQL Server重啟后會被自動創(chuàng)建,所以你必須使用startup stored procedure來為TempDb創(chuàng)建自定義數據類型。你也可以通過修改Model數據庫來達到這一目標。
7、XML列不能定義成XML集合的形式,除非這個集合已經在TempDb中定義。
臨時表既可以通過Create Table語句創(chuàng)建,也可以通過"SELECT select_list> INTO #table"語句創(chuàng)建。你還可以針對臨時表用"INSERT INTO #table EXEC stored_procedure"這樣的語句。
 臨時表可以擁有命名的約束和索引。但是,當兩個用戶在同一時間調用同一存儲過程時,將會產生”There is already an object named ‘objectname>' in the database”這樣的錯誤。所以最好的做法是不用為建立的對象進行命名,而使用系統(tǒng)分配的在TempDb中唯一的。

三、誤區(qū)

誤區(qū)1.表變量僅僅在內存中。

誤區(qū)2.臨時表僅僅存儲在物理介質中。

這兩種觀點都是錯誤的,只有內存足夠,表變量和臨時表都會在內存中創(chuàng)建和處理。他們也同樣可以在任何時間被存入磁盤。
  注意表變量的名字是系統(tǒng)分配的,表變量的第一個字符”@”并不是一個字母,所以它并不是一個有效的變量名。系統(tǒng)會在TempDb中為表變量創(chuàng)建一個系統(tǒng)分配的名稱,所以任何在sysobjects或sys.tables查找表變量的方法都會失敗。

  正確的方法應該是我前面例子中的方法,我看到很多人使用如下查詢查表變量:

  select * from sysobjects where name like'#tempTables%'

  上述代碼看上去貌似很好用,但會產生多用戶的問題。你建立兩個連接,在第一個連接中創(chuàng)建臨時表,在第二個窗口中運行上面的語句能看到第一個連接創(chuàng)建的臨時表,如果你在第二個連接中嘗試操作這個臨時表,那么可能會產生錯誤,因為這個臨時表不屬于你的會話。

  誤區(qū)3.表變量不能擁有索引。

這個誤區(qū)也同樣錯誤。雖然一旦你創(chuàng)建一個表變量之后,就不能對其進行DDL語句了,這包括Create Index語句。然而你可以在表變量定義的時候為其創(chuàng)建索引)比如如下語句。

  declare @MyTableVariable table (RowID intPRIMARY KEY CLUSTERED)

這個語句將會創(chuàng)建一個擁有聚集索引的表變量。由于主鍵有了對應的聚集索引,所以一個系統(tǒng)命名的索引將會被創(chuàng)建在RowID列上。

下面的例子演示你可以在一個表變量的列上創(chuàng)建唯一約束以及如何建立復合索引。

declare @temp TABLE (
   RowID int NOT NULL,
   ColA int NOT NULL,
   ColB char(1)UNIQUE,
   PRIMARY KEY CLUSTERED(RowID, ColA))

1) SQL 并不能為表變量建立統(tǒng)計信息,就像其能為臨時表建立統(tǒng)計信息一樣。這意味著對于表變量,執(zhí)行引擎認為其只有1行,這也意味著針對表變量的執(zhí)行計劃并不是最優(yōu)。雖然估計的執(zhí)行計劃對于表變量和臨時表都為1,但是實際的執(zhí)行計劃對于臨時表會根據每次存儲過程的重編譯而改變。如果臨時表不存在,在生成執(zhí)行計劃的時候會產生錯誤。

2) 一旦建立表變量后就無法對其進行DDL語句操作。因此如果需要為表建立索引或者加一列,你需要臨時表。

3) 表變量不能使用select …into語句,而臨時表可以。

4) 在SQL Server 2008中,你可以將表變量作為參數傳入存儲過程。但是臨時表不行。在SQL Server 2000和2005中表變量也不行。

5) 作用域:表變量僅僅在當前的批處理中有效,并且對任何在其中嵌套的存儲過程等不可見。局部臨時表只在當前會話中有效,這也包括嵌套的存儲過程。但對父存儲過程不可見。全局臨時表可以在任何會話中可見,但是會隨著創(chuàng)建其的會話終止而DROP,其它會話這時就不能再引用全局臨時表。

6) 排序規(guī)則:表變量使用當前數據庫的排序規(guī)則,臨時表使用TempDb的排序規(guī)則。如果它們不兼容,你還需要在查詢或者表定義中進行指定。

7) 你如果希望在動態(tài)SQL中使用表變量,你必須在動態(tài)SQL中定義表變量。而臨時表可以提前定義,在動態(tài)SQL中進行引用。

四、如何選擇

微軟推薦使用表變量,如果表中的行數非常小,則使用表變量。很多”網絡專家”會告訴你100是一個分界線,因為這是統(tǒng)計信息創(chuàng)建查詢計劃效率高低的開始。但是我還是希望告訴你針對你的特定需求對臨時表和表變量進行測試。很多人在自定義函數中使用表變量,如果你需要在表變量中使用主鍵和唯一索引,你會發(fā)現包含數千行的表變量也依然性能卓越。但如果你需要將表變量和其它表進行join,你會發(fā)現由于不精準的執(zhí)行計劃,性能往往會非常差。

為了證明這點,請看本文的附件。附件中代碼創(chuàng)建了表變量和臨時表.并裝入了AdventureWorks數據庫的Sales.SalesOrderDetail表。為了得到足夠的測試數據,我將這個表中的數據插入了10遍。然后以ModifiedDate 列作為條件將臨時表和表變量與原始的Sales.SalesOrderDetail表進行了Join操作,從統(tǒng)計信息來看IO差別顯著。從時間來看表變量做join花了50多秒,而臨時表僅僅花了8秒。

如果你需要在表建立后對表進行DLL操作,那么選擇臨時表吧。

臨時表和表變量有很多類似的地方。所以有時候并沒有具體的細則規(guī)定如何選擇哪一個。對任何特定的情況,你都需要考慮其各自優(yōu)缺點并做一些性能測試。下面的表格會讓你比較其優(yōu)略有了更詳細的參考。

特性 表變量 臨時表
作用域 當前批處理 當前會話,嵌套存儲過程,全局:所有會話
使用場景 自定義函數,存儲過程,批處理 自定義函數,存儲過程,批處理
創(chuàng)建方式 DECLARE statement only.只能通過DECLEARE語句創(chuàng)建

CREATE TABLE 語句

SELECT INTO 語句.

表名長度 最多128字節(jié) 最多116字節(jié)
列類型

可以使用自定義數據類型

可以使用XML集合

自定義數據類型和XML集合必須在TempDb內定義
Collation 字符串排序規(guī)則繼承自當前數據庫 字符串排序規(guī)則繼承自TempDb數據庫
索引 索引必須在表定義時建立 索引可以在表創(chuàng)建后建立
約束 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 語句. 
當前會話結束自動析構 (全局臨時表: 還包括當其它會話語句不在引用表.)
事務 只會在更新表的時候有事務,持續(xù)時間比臨時表短 正常的事務長度,比表變量長
存儲過程重編譯 會導致重編譯
回滾 不會被回滾影響 會被回滾影響
統(tǒng)計數據 不創(chuàng)建統(tǒng)計數據,所以所有的估計行數都為1,所以生成執(zhí)行計劃會不精準 創(chuàng)建統(tǒng)計數據,通過實際的行數生成執(zhí)行計劃。
作為參數傳入存儲過程 僅僅在SQL Server2008, 并且必須預定義 user-defined table type. 不允許
顯式命名對象 (索引, 約束). 不允許 允許,但是要注意多用戶的問題
動態(tài)SQL 必須在動態(tài)SQL中定義表變量 可以在調用動態(tài)SQL之前定義臨時表

您可能感興趣的文章:
  • SQLServer中臨時表與表變量的區(qū)別分析
  • sql server創(chuàng)建臨時表的兩種寫法和刪除臨時表
  • sqlserver 臨時表的用法
  • sql server 臨時表 查找并刪除的實現代碼
  • sql server中判斷表或臨時表是否存在的方法
  • sqlserver 臨時表 Vs 表變量 詳細介紹
  • SQL Server 向臨時表插入數據示例
  • sqlserver 動態(tài)創(chuàng)建臨時表的語句分享
  • sql server 創(chuàng)建臨時表的使用說明
  • SQL SERVER臨時表排序問題的解決方法

標簽:南京 河北 廣安 通遼 阿里 馬鞍山 福建 陜西

巨人網絡通訊聲明:本文標題《SQL Server 表變量和臨時表的區(qū)別(詳細補充篇)》,本文關鍵詞  SQL,Server,表,變量,和,臨時,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL Server 表變量和臨時表的區(qū)別(詳細補充篇)》相關的同類信息!
  • 本頁收集關于SQL Server 表變量和臨時表的區(qū)別(詳細補充篇)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本少妇一区二区| 99re8在线精品视频免费播放| 午夜视黄欧洲亚洲| 成人毛片视频在线观看| 26uuu国产在线精品一区二区| 午夜私人影院久久久久| 色猫猫国产区一区二在线视频| 国产欧美日韩中文久久| 精品在线一区二区| 2023国产精华国产精品| 久久精品999| 1000精品久久久久久久久| 成人激情校园春色| 视频一区二区三区中文字幕| 在线播放中文一区| 六月丁香综合在线视频| 欧美一区二区大片| 国产在线一区观看| 亚洲欧洲日产国产综合网| 欧美日韩一区不卡| 国产成人无遮挡在线视频| 亚洲制服丝袜在线| 久久久久97国产精华液好用吗| 久久久综合视频| 99视频热这里只有精品免费| av毛片久久久久**hd| 在线观看免费成人| 91精品国产综合久久精品麻豆| 成人av网址在线观看| 欧美日韩在线播放一区| 91麻豆精品国产91久久久久 | 91一区二区三区在线观看| 99久久精品国产一区| 欧美中文字幕一二三区视频| 日韩亚洲电影在线| 中文字幕五月欧美| 日日嗨av一区二区三区四区| 欧美变态tickle挠乳网站| 91一区二区在线| 国产精品亚洲一区二区三区妖精 | 91精品国产综合久久婷婷香蕉| 国产乱码一区二区三区| 久久99精品国产.久久久久久| 91精品国产美女浴室洗澡无遮挡| 国产乱码精品一区二区三区av| 一区二区三区在线播| 国产精品无码永久免费888| 欧美丰满美乳xxx高潮www| 日本韩国精品一区二区在线观看| 国产高清不卡一区二区| 日本最新不卡在线| 青青草91视频| 国产精品综合一区二区三区| 精品一区二区在线免费观看| 免费成人在线影院| 麻豆久久一区二区| 久久精品国产99| 成人免费视频app| 91亚洲大成网污www| 欧美日韩在线免费视频| 日韩女优电影在线观看| 久久嫩草精品久久久精品| 中文字幕综合网| 免费在线观看精品| 一本大道av伊人久久综合| 91精品国产欧美日韩| 中文字幕一区二区三区视频| 偷拍自拍另类欧美| 色欧美88888久久久久久影院| 欧美国产日韩亚洲一区| 一区二区成人在线观看| 国产精品伊人色| 精品不卡在线视频| 国产1区2区3区精品美女| 国产清纯白嫩初高生在线观看91| 亚洲私人影院在线观看| 国产一区在线视频| 一本到一区二区三区| 久久你懂得1024| 国产成人h网站| 久久精品一区二区| 粉嫩嫩av羞羞动漫久久久 | 久久精品免费在线观看| av在线综合网| 天堂在线亚洲视频| 欧美日韩午夜影院| 欧美年轻男男videosbes| 日韩和欧美的一区| 国产情人综合久久777777| 粉嫩aⅴ一区二区三区四区| 欧美成人vps| 不卡免费追剧大全电视剧网站| 777a∨成人精品桃花网| av一区二区三区四区| 日本色综合中文字幕| 亚洲乱码国产乱码精品精小说| 6080午夜不卡| 欧美视频第二页| 91丝袜美腿高跟国产极品老师| 日本高清视频一区二区| 蜜桃av一区二区三区| 欧美成人女星排行榜| 欧美亚洲国产一卡| 国产精品亚洲а∨天堂免在线| 一区二区三区视频在线看| 国产精品女人毛片| 亚洲国产成人自拍| 在线电影院国产精品| 7777精品久久久大香线蕉| 97久久超碰国产精品电影| 国产黑丝在线一区二区三区| 午夜不卡在线视频| 亚洲精品一区二区三区影院| av中文字幕亚洲| 成人高清伦理免费影院在线观看| 国产高清无密码一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 亚洲激情欧美激情| 色一区在线观看| 五月综合激情网| 欧美国产丝袜视频| 欧美精品高清视频| 91国产丝袜在线播放| 欧美一区二区视频网站| 午夜一区二区三区视频| 精品免费国产二区三区| 亚洲一区二区高清| 91久久国产最好的精华液| 亚洲乱码国产乱码精品精的特点 | 国产成人综合精品三级| 秋霞电影一区二区| 日本欧美加勒比视频| 一区二区三区 在线观看视频| 久久女同性恋中文字幕| 亚洲色图欧美偷拍| 亚洲成av人**亚洲成av**| 亚洲chinese男男1069| 久久国产精品色婷婷| av一区二区不卡| 日本韩国欧美一区二区三区| 日韩一级高清毛片| 精品国产伦理网| 国产农村妇女精品| 国产精品一区二区在线观看不卡 | 91精品国产综合久久香蕉的特点| 国产精品久久久爽爽爽麻豆色哟哟 | 成人午夜视频在线观看| 日韩高清国产一区在线| 久久91精品国产91久久小草| 成人免费电影视频| 久久精品亚洲麻豆av一区二区 | 亚洲国产岛国毛片在线| 免费日本视频一区| 91免费小视频| 久久综合九色欧美综合狠狠| 日韩电影在线免费观看| 日本高清成人免费播放| 日日摸夜夜添夜夜添国产精品| 91色乱码一区二区三区| 亚洲成av人**亚洲成av**| 粗大黑人巨茎大战欧美成人| 日本乱码高清不卡字幕| 一片黄亚洲嫩模| 欧美精品自拍偷拍| 国产乱码一区二区三区| 日韩成人一区二区| 在线成人免费观看| 东方欧美亚洲色图在线| 日本一区二区三区四区 | 欧美日韩国产免费| 国产 欧美在线| 国产欧美一区二区精品婷婷 | 欧美日韩一本到| 成人在线视频一区| 性欧美疯狂xxxxbbbb| 2020国产精品| 欧洲另类一二三四区| 捆绑变态av一区二区三区| 久久精品一区二区三区不卡| 日韩精品一二三四| 欧美一区二视频| 久久久亚洲午夜电影| 国产盗摄视频一区二区三区| 国产精品美女久久久久久久| 欧美性猛交xxxxxx富婆| 老司机一区二区| 亚洲天堂精品在线观看| 欧美情侣在线播放| 国产一区二区在线视频| 亚洲综合免费观看高清在线观看| 欧美日韩亚洲综合在线| 东方aⅴ免费观看久久av| 日一区二区三区| 国产精品沙发午睡系列990531| 欧美日韩久久久| 国产激情视频一区二区三区欧美 | 亚洲免费在线观看| 欧美成人r级一区二区三区| 欧美视频第二页| 99精品国产99久久久久久白柏|