亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQLServer中臨時表與表變量的區別分析

2020-07-25 13:25:45
字體:
來源:轉載
供稿:網友

在實際使用的時候,我們如何靈活的在存儲過程中運用它們,雖然它們實現的功能基本上是一樣的,可如何在一個存儲過程中有時候去使用臨時表而不使用表變量,有時候去使用表變量而不使用臨時表呢?
臨時表

  臨時表與永久表相似,只是它的創建是在Tempdb中,它只有在一個數據庫連接結束后或者由SQL命令DROP掉,才會消失,否則就會一直存在。臨時表在創建的時候都會產生SQL Server的系統日志,雖它們在Tempdb中體現,是分配在內存中的,它們也支持物理的磁盤,但用戶在指定的磁盤里看不到文件。

  臨時表分為本地和全局兩種,本地臨時表的名稱都是以“#”為前綴,只有在本地當前的用戶連接中才是可見的,當用戶從實例斷開連接時被刪除。全局臨時表的名稱都是以“##”為前綴,創建后對任何用戶都是可見的,當所有引用該表的用戶斷開連接時被刪除。

  下面我們來看一個創建臨時表的例子:

CREATE TABLE dbo.#News   (   News_id int NOT NULL,   NewsTitle varchar(100),   NewsContent varchar(2000),   NewsDateTime datetime   ) 


臨時表可以創建索引,也可以定義統計數據,所以可以用數據定義語言(DDL)的聲明來阻止臨時表添加的限制,約束,并參照完整性,如主鍵和外鍵約束。比如來說,我們現在來為#News表字段NewsDateTime來添加一個默認的GetData()當前日期值,并且為News_id添加一個主鍵,我們就可以使用下面的語句:

ALTER TABLE dbo.#News   ADD   CONSTRAINT [DF_NewsDateTime] DEFAULT (GETDATE()) FOR [NewsDateTime],   PRIMARY KEY CLUSTERED   (   [News_id]   ) ON [PRIMARY]   GO 


臨時表在創建之后可以修改許多已定義的選項,包括:

  1)添加、修改、刪除列。例如,列的名稱、長度、數據類型、精度、小數位數以及為空性均可進行修改,只是有一些限制而已。

  2)可添加或刪除主鍵和外鍵約束。

  3)可添加或刪除 UNIQUE 和 CHECK 約束及 DEFAULT 定義(對象)。

  4)可使用 IDENTITY 或 ROWGUIDCOL 屬性添加或刪除標識符列。雖然 ROWGUIDCOL 屬性也可添加至現有列或從現有列刪除,但是任何時候在表中只能有一列可具有該屬性。

  5)表及表中所選定的列已注冊為全文索引。

  表變量

  表變量創建的語法類似于臨時表,區別就在于創建的時候,必須要為之命名。表變量是變量的一種,表變量也分為本地及全局的兩種,本地表變量的名稱都是以“@”為前綴,只有在本地當前的用戶連接中才可以訪問。全局的表變量的名稱都是以“@@”為前綴,一般都是系統的全局變量,像我們常用到的,如 @@Error代表錯誤的號,@@RowCount代表影響的行數。

  如我們看看創建表變量的語句:

復制代碼 代碼如下:

DECLARE @News Table
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )

比較臨時表及表變量都可以通過SQL的選擇、插入、更新及刪除語句,它們的的不同主要體現在以下這些:

  1)表變量是存儲在內存中的,當用戶在訪問表變量的時候,SQL Server是不產生日志的,而在臨時表中是產生日志的;

  2)在表變量中,是不允許有非聚集索引的;

  3)表變量是不允許有DEFAULT默認值,也不允許有約束;

  4)臨時表上的統計信息是健全而可靠的,但是表變量上的統計信息是不可靠的;

  5)臨時表中是有鎖的機制,而表變量中就沒有鎖的機制。

  我們現在來看一個完整的例子,來看它們的用法的異同:

  利用臨時表  
復制代碼 代碼如下:

CREATE TABLE dbo.#News
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )
  INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News
  DROP TABLE dbo.[#News]

利用表變量 
復制代碼 代碼如下:

DECLARE @News table
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )
  INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)
  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News

我們可以看到上面兩種情況實現的是一樣的效果,第一種利用臨時表的時候,臨時表一般被創建后,如果在執行的時候,沒有通過DROP Table的操作,第二次就不能再被創建,而定義表變量也不需要進行DROP Table的操作,一次執行完成后就會消失。






  其實在選擇臨時表還是表變量的時候,我們大多數情況下在使用的時候都是可以的,但一般我們需要遵循下面這個情況,選擇對應的方式:

  1)使用表變量主要需要考慮的就是應用程序對內存的壓力,如果代碼的運行實例很多,就要特別注意內存變量對內存的消耗。我們對于較小的數據或者是通過計算出來的推薦使用表變量。如果數據的結果比較大,在代碼中用于臨時計算,在選取的時候沒有什么分組的聚合,就可以考慮使用表變量。

  2)一般對于大的數據結果,或者因為統計出來的數據為了便于更好的優化,我們就推薦使用臨時表,同時還可以創建索引,由于臨時表是存放在Tempdb中,一般默認分配的空間很少,需要對tempdb進行調優,增大其存儲的空間。




3)如果要在自定義函數中返回一個表,要用表變量如:
復制代碼 代碼如下:

dbo.usp_customersbyPostalCode

( @PostalCode VARCHAR(15) )
RETURNS
@CustomerHitsTab TABLE (
[CustomerID] [nchar] (5),
[ContactName] [nvarchar] (30),
[Phone] [nvarchar] (24),
[Fax] [nvarchar] (24)
)
AS
BEGIN
DECLARE @HitCount INT

INSERT INTO @CustomerHitsTab
SELECT [CustomerID],
[ContactName],
[Phone],
[Fax]
FROM [Northwind].[dbo].[Customers]
WHERE PostalCode = @PostalCode

SELECT @HitCount = COUNT(*)


FROM @CustomerHitsTab

IF @HitCount = 0
--No Records Match Criteria
INSERT INTO @CustomerHitsTab (
[CustomerID],
[ContactName],
[Phone],
[Fax] )
VALUES ('','No Companies In Area','','')
RETURN
END
GO

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91精品在线播放| 日韩高清电影免费观看完整| 久久夜色精品国产欧美乱| 精品国产电影一区| 亚洲精品国产精品乱码不99按摩| 美女黄色丝袜一区| 97国产在线视频| 91久久精品一区| 久久91超碰青草是什么| 国产成人免费av电影| 亚洲性日韩精品一区二区| 久久天天躁狠狠躁夜夜躁| 久久久精品2019中文字幕神马| 久久久国产视频| 欧美日韩综合视频网址| 欧美日韩精品在线| 中文字幕欧美视频在线| 国产精品美女免费| 国产精品国产三级国产aⅴ浪潮| 久久精品中文字幕一区| 欧美电影在线观看高清| 成人性生交大片免费观看嘿嘿视频| 欧美视频13p| 日本亚洲欧美成人| 国产精品黄视频| 中日韩午夜理伦电影免费| 亚洲免费成人av电影| 日韩成人在线视频网站| 国产精品你懂得| 国产精品黄页免费高清在线观看| 国自产精品手机在线观看视频| 另类天堂视频在线观看| 狠狠综合久久av一区二区小说| 亚洲天堂成人在线视频| 中文字幕亚洲情99在线| 97超碰国产精品女人人人爽| 久久综合久久88| 精品一区二区三区三区| 欧美精品一区二区三区国产精品| 亚洲免费视频一区二区| 26uuu另类亚洲欧美日本一| www.日本久久久久com.| 午夜精品久久久久久久白皮肤| 精品国产一区二区三区久久狼5月| 日韩成人在线视频网站| 日韩美女在线观看| 日韩在线观看电影| 91久久精品国产91久久| 日韩欧美aaa| 国产亚洲美女久久| 57pao精品| 欧美激情成人在线视频| 欧美精品久久久久久久久| 亚洲男人天堂九九视频| 欧洲午夜精品久久久| 亚洲欧美日韩一区二区三区在线| 欧美日韩国产二区| 亚洲淫片在线视频| 亚洲男人第一网站| 国产欧美婷婷中文| 久久亚洲精品小早川怜子66| 国产精品久久久久久久午夜| 91精品国产综合久久久久久蜜臀| 日韩禁在线播放| 久久亚洲私人国产精品va| 国产欧美在线播放| 日韩电影免费观看在线观看| 日韩av电影院| 国产精品pans私拍| 日韩精品在线免费观看视频| 欧美日韩国产综合视频在线观看中文| 亚洲激情视频在线播放| 欧美黄色片在线观看| 欧美特黄级在线| 国产欧美亚洲视频| 欧美高跟鞋交xxxxxhd| 国产一区二区av| 久久躁狠狠躁夜夜爽| 91av视频在线| 国产精品免费观看在线| 国产精品一区二区久久| 日韩在线中文视频| 亚洲精品之草原avav久久| 91av成人在线| 超碰97人人做人人爱少妇| 国产精品一区二区久久久久| 国产日韩视频在线观看| 在线免费看av不卡| 亚洲国产成人精品一区二区| 日本精品在线视频| 亚洲欧美制服另类日韩| 国产精品影院在线观看| 57pao成人永久免费视频| 91久久综合亚洲鲁鲁五月天| 91精品在线观| 国产精品欧美在线| 亚洲性视频网站| 中文字幕在线日韩| 日本欧美精品在线| 国产精品美女主播在线观看纯欲| 2019国产精品自在线拍国产不卡| 久久九九有精品国产23| 精品国产一区二区三区久久狼5月| 久久久久久美女| 国产日韩在线免费| 亚洲精品福利免费在线观看| 成人h视频在线| 亚洲国内精品在线| 三级精品视频久久久久| 欧美日韩国产成人在线| 美女av一区二区三区| 亚洲精品视频二区| 久久夜色精品亚洲噜噜国产mv| 欧美一二三视频| 亚洲男女性事视频| 免费不卡在线观看av| 一个色综合导航| 91av网站在线播放| 久久综合伊人77777蜜臀| 91性高湖久久久久久久久_久久99| 热久久这里只有| 日韩精品中文字幕久久臀| 精品欧美aⅴ在线网站| 国产盗摄xxxx视频xxx69| 欧美激情精品久久久久久| 国内精品久久久久久中文字幕| 日韩美女在线观看一区| 777国产偷窥盗摄精品视频| 成人av电影天堂| 精品亚洲夜色av98在线观看| 日韩精品在线免费观看视频| 欧美性20hd另类| 欧美中文字幕在线播放| 一道本无吗dⅴd在线播放一区| 久久成人一区二区| 亚洲国产高潮在线观看| 日韩av日韩在线观看| 成人情趣片在线观看免费| www.精品av.com| 久久久精品欧美| 国产不卡av在线| 日韩精品在线视频观看| 日本在线观看天堂男亚洲| 日韩久久精品电影| 视频一区视频二区国产精品| 久久国产色av| 国产91ⅴ在线精品免费观看| 亚洲国产精品小视频| 中文字幕日韩av综合精品| 97免费中文视频在线观看| 精品久久久久久中文字幕| 欧美性xxxx极品hd欧美风情| 成人在线视频网站| 九九精品在线播放| 久久视频在线播放| 97热精品视频官网| 68精品国产免费久久久久久婷婷| 96pao国产成视频永久免费| 国产精品在线看| 庆余年2免费日韩剧观看大牛| 欧美日韩久久久久| 亚洲欧美精品中文字幕在线| 国产免费一区视频观看免费| 久久久999精品视频|