當前位置:首頁 » 編程語言 » sql創建臨時表和兩個區別
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql創建臨時表和兩個區別

發布時間: 2022-06-30 06:42:17

sql臨時表的區別

在sqlserver中請用sql創建一張用戶臨時表和系統臨時表,裡麵包含兩個欄位ID和IDValues,類型都是int型
用戶臨時表:create table #xx(ID int, IDValues int)
系統臨時表:create table ##xx(ID int, IDValues int)

區別:
用戶臨時表只對創建這個表的用戶的Session可見,對其他進程是不可見的.
當創建它的進程消失時這個臨時表就自動刪除.

全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.
希望你能理解!

㈡ 我想知道 在存儲過程中創建的臨時表 和 正常創建的臨時表有什麼區別

有區別,正常建立的臨時表是一直存在的,除非資料庫重啟或者用語句刪除,存儲過程中建立的,等存儲過程執行完以後,臨時表銷毀,表空間釋放。

㈢ sql創建臨時表一個#和兩個#的區別

#本地臨時表

## 全局臨時表 所有用戶可見。

㈣ SQL Server 表變數和臨時表的區別

一、表變數
表變數在SQL Server 2000中首次被引入。表變數的具體定義包括列定義,列名,數據類型和約束。而在表變數中可以使用的約束包括主鍵約束,唯一約束,NULL約束和CHECK約束(外鍵約束不能在表變數中使用)。定義表變數的語句是和正常使用Create Table定義表語句的子集。只是表變數通過DECLARE @local_variable語句進行定義。
表變數的特徵:
表變數擁有特定作用域(在當前批處理語句中,但不在任何當前批處理語句調用的存儲過程和函數中),表變數在批處理結束後自動被清除。
表變數較臨時表產生更少的存儲過程重編譯。
針對表變數的事務僅僅在更新數據時生效,所以鎖和日誌產生的數量會更少。
由於表變數的作用域如此之小,而且不屬於資料庫的持久部分,所以事務回滾不會影響表變數。
表變數可以在其作用域內像正常的表一樣使用。更確切的說,表變數可以被當成正常的表或者表表達式一樣在SELECT,DELETE,UPDATE,INSERT語句中使用,但是表變數不能在類似"SELECT select_list INTO table_variable"這樣的語句中使用。而在SQL Server2000中,表變數也不能用於INSERT INTO table_variable EXEC stored_procere這樣的語句中。
表變數不能做如下事情:
雖然表變數是一個變數,但是其不能賦值給另一個變數。
check約束,默認值和計算列不能引用自定義函數。
不能為約束命名。
不能Truncate表變數。
不能向標識列中插入顯式值(也就是說表變數不支持SET IDENTITY_INSERT ON)
二、臨時表
在深入臨時表之前,我們要了解一下會話(Session),一個會話僅僅是一個客戶端到數據引擎的連接。在SQL Server Management Studio中,每一個查詢窗口都會和資料庫引擎建立連接。一個應用程序可以和資料庫建立一個或多個連接,除此之外,應用程序還可能建立連接後一直不釋放知道應用程序結束,也可能使用完釋放連接需要時建立連接。
臨時表和Create Table語句創建的表有著相同的物理工程,但臨時表與正常的表不同之處有:
1、臨時表的名稱不能超過116個字元,這是由於資料庫引擎為了辨別不同會話建立不同的臨時表,所以會自動在臨時表的名字後附加一串。
2、局部臨時表(以"#"開頭命名的)作用域僅僅在當前的連接內,從在存儲過程中建立局部臨時表的角度來看,局部臨時表會在下列情況下被Drop:
a、顯示調用Drop Table語句
b、當局部臨時表在存儲過程內被創建時,存儲過程結束也就意味著局部臨時表被Drop。
c、當前會話結束,在會話內創建的所有局部臨時表都會被Drop。
3、全局臨時表(以"##"開頭命名的)在所有的會話內可見,所以在創建全局臨時表之前首先檢查其是否存在,否則如果已經存在,你將會得到重復創建對象的錯誤。
a、全局臨時表會在創建其的會話結束後被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、不能對臨時表進行分區。
5、不能對臨時表加外鍵約束。
6、臨時表內列的數據類型不能定義成沒有在TempDb中沒有定義自定義數據類型(自定義數據類型是資料庫級別的對象,而臨時表屬於TempDb)。由於TempDb在每次SQL Server重啟後會被自動創建,所以你必須使用startup stored procere來為TempDb創建自定義數據類型。你也可以通過修改Model資料庫來達到這一目標。
7、XML列不能定義成XML集合的形式,除非這個集合已經在TempDb中定義。
臨時表既可以通過Create Table語句創建,也可以通過"SELECT <select_list> INTO #table"語句創建。你還可以針對臨時表用"INSERT INTO #table EXEC stored_procere"這樣的語句。
臨時表可以擁有命名的約束和索引。但是,當兩個用戶在同一時間調用同一存儲過程時,將會產生」There is already an object named 『<objectname>』 in the database」這樣的錯誤。所以最好的做法是不用為建立的對象進行命名,而使用系統分配的在TempDb中唯一的。

㈤ Oracle臨時表和SQL Server臨時表的不同點對比

Oracle資料庫創建臨時表的過程以及和SQL Server臨時表的不同點的對比的相關知識是本文我們主要要介紹的內容,接下來就讓我們一起來了解一下這部分內容吧,希望能夠對您有所幫助。
1.簡介
Oracle資料庫除了可以保存永久表外,還可以建立臨時表temporary tables。這些臨時表用來保存一個會話SESSION的數據,或者保存在一個事務中需要的數據。當會話退出或者用戶提交commit和回滾rollback事務的時候,臨時表的數據自動清空,但是臨時表的結構以及元數據還存儲在用戶的數據字典中。
2.詳細介紹
Oracle臨時表分為會話級臨時表和事務級臨時表。
會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。
事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。
臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,並且不能訪問其它Session的臨時表中的數據。因此,臨時表不需要DML鎖。
當一個會話結束(用戶正常退出 用戶不正常退出 ORACLE實例崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE 語句清空臨時表數據.但不會清空其它會話臨時表中的數據.
你可以索引臨時表和在臨時表基礎上建立視圖.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效. 臨時表可以擁有觸發器.
3.建立臨時表
臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.
建立方法:
1) ON COMMIT DELETE ROWS 定義了建立事務級臨時表的方法. CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS; EXAMPLE: SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 2 (startdate DATE, 3 enddate DATE, 4 class CHAR(20)) 5 ON COMMIT DELETE ROWS; SQL> create table permernate( a number); SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table'); SQL> insert into permernate values(1); SQL> commit; SQL> select * from admin_work_area; SQL> select * from permernate; A 1 2)ON COMMIT PRESERVE ROWS 定義了創建會話級臨時表的方法. CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT PRESERVE ROWS; EXAMPLE:

會話1:
SQL> drop table admin_work_area; SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 2 (startdate DATE, 3 enddate DATE, 4 class CHAR(20)) 5 ON COMMIT PRESERVE ROWS; SQL> insert into permernate values(2); SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary'); SQL> commit; SQL> select * from permernate; A ---------- 1 2 SQL> select * from admin_work_area; STARTDATE ENDDATE CLASS ---------- ---------- -------------------- 17-1?? -03 17-1?? -03 session temperary

會話2:
SQL> select * from permernate; A ---------- 1 2 SQL> select * from admin_work_area; 未選擇行.

會話2看不見會話1中臨時表的數據。
4.Oracle臨時表和SQL Server臨時表異同
SQL Server也可以創建臨時表。臨時表與永久表相似,但臨時表存儲在tempdb中,當不再使用時會自動刪除。
有本地和全局兩種類型的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字元號 (#) 打頭;它們僅對當前的用戶連接是可見的;當用戶從 Microsoft SQL Server實例斷開連接時被刪除。全局臨時表的名稱以數學符號 (##) 打頭,創建後對任何用戶都是可見的,當所有引用該表的用戶從 SQL Server 斷開連接時被刪除。
SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) INSERT INTO #MyTempTable VALUES (1)

如果本地臨時表由存儲過程創建或由多個用戶同時執行的應用程序創建,則 SQL Server 必須能夠區分由不同用戶創建的表。為此,SQL Server 在內部為每個本地臨時表的表名追加一個數字後綴。存儲在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字後綴組成。為了允許追加後綴,為本地臨時表指定的表名 table_name 不能超過116 個字元。
除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:
當存儲過程完成時,將自動除去在存儲過程中創建的本地臨時表。由創建表的存儲過程執行的所有嵌套存儲過程都可以引用此表。但調用創建此表的存儲過程的進程無法引用此表。
所有其它本地臨時表在當前會話結束時自動除去。
全局臨時表在創建此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存周期內保持。換言之,當創建全局臨時表的會話結束時,最後一條引用此表的Transact-SQL語句完成後,將自動除去此表。
例如,如果創建名為 employees 的表,則任何人只要在資料庫中有使用該表的安全許可權就可以使用該表,除非它已刪除。如果創建名為 #employees 的本地臨時表,只有您能對該表執行操作且在斷開連接時該表刪除。如果創建名為 ##employees 的全局臨時表,資料庫中的任何用戶均可對該表執行操作。如果該表在您創建後沒有其他用戶使用,則當您斷開連接時該表刪除。如果該表在您創建後有其他用戶使用,則 SQL Server在所有用戶斷開連接後刪除該表。
在存儲過程或觸發器中創建的本地臨時表與在調用存儲過程或觸發器之前創建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所創建的表,例如:
CREATE PROCEDURE Test2 AS CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (2) SELECT Test2Col = x FROM #t GO CREATE PROCEDURE Test1 AS CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (1) SELECT Test1Col = x FROM #t EXEC Test2 GO CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (99) GO EXEC Test1 GO

下面是結果集:
(1 row(s) affected) Test1Col ----------- 1 (1 row(s) affected) Test2Col ----------- 2

當創建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創建,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。
考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。
和Oracle的不同點:
1. SQL Server臨時表是一種」內存表」,表是存儲在內存中的.ORACLE臨時表除非執行DROP TABLE,否則表定義會保留在數據字典中。
2. SQL Server臨時表不存在類似ORACLE臨時表事務級別上的功能。
3.SQL Server本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,ORACLE不會刪除表。
4.SQL Server的全局臨時表(##) 是指多個連接共享同一片內存.當沒有指針引用該內存區域時,SQL Server自動釋放全局臨時表。
5.由於Oracle不是一種內存中的資料庫. 所以如果Oracle類似SQL Server 頻繁的對臨時表進行建立和刪除,必定會影響性能.所以Oracle會保留臨時表的定義直到用戶DROP TABLE。
6.在Oracle中,如果需要多個用戶共享一個表(類似SQL Server的全局臨時表##).則可以利用永久表,並且在表中添加一些可以唯一標識用戶的列.利用觸發器和視圖.當用戶退出的時候,根據該登陸用戶的唯一信息刪除相應的表中的數據. 這種方法給Oracle帶來了一定量的負載。
關於Oracle臨時表和SQL Server臨時表的不同點對比的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!

㈥ 什麼叫臨時表它與普通表有什麼區別

作用域不同,當你關閉sql連接的時候 臨時表就會 自動刪除,普通表不會
1、創建方法:
方法一:
create table TempTableName

select [欄位1,欄位2,...,] into TempTableName from table
方法二:
create table tempdb.MyTempTable(Tid int)
說明:
(1)、臨時表其實是放在資料庫tempdb里的一個用戶表;
(2)、TempTableName必須帶「#」,「#"可以是一個或者兩個,以#(局部)或##(全局)開頭的表,這種表在會話期間存在,會話結束則自動刪除;
(3)、如果創建時不以#或##開頭,而用tempdb.TempTable來命名它,則該表可在資料庫重啟前一直存在。
2、手動刪除
drop table TempTableName

普通表和臨時表的區別只是表名開頭無 "#"

㈦ SQL 全局臨時表和普通臨時表在使用時有什麼區別

普通臨時表只存在當前會話中,其他會話不能調用。全局臨時表存在當前會話中,其他會話也能調用,所以會有並發沖突的可能

㈧ SQL Server 表變數和臨時表的區別

一、表變數

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

表變數的特徵:

表變數擁有特定作用域(在當前批處理語句中,但不在任何當前批處理語句調用的存儲過程和函數中),表變數在批處理結束後自動被清除。

表變數較臨時表產生更少的存儲過程重編譯。

針對表變數的事務僅僅在更新數據時生效,所以鎖和日誌產生的數量會更少。

由於表變數的作用域如此之小,而且不屬於資料庫的持久部分,所以事務回滾不會影響表變數。

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

表變數不能做如下事情:

雖然表變數是一個變數,但是其不能賦值給另一個變數。

check約束,默認值和計算列不能引用自定義函數。

不能為約束命名。

不能Truncate表變數。

不能向標識列中插入顯式值(也就是說表變數不支持SET IDENTITY_INSERT ON)

下面來玩玩表變數吧。

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

DECLARE @tb1 Table
(
Id int,
Name varchar(20),
Age int
)

INSERT INTO @tb1 VALUES(1,'劉備',22)

SELECT * FROM @tb1

輸出結果如下:

SQL Server不支持定義表變數時對Constraint命名,也不支持定義表變數後,對其建Constraint。

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

二、臨時表

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

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

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

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

3、全局臨時表(以"##"開頭命名的)在所有的會話內可見,所以在創建全局臨時表之前首先檢查其是否存在,否則如果已經存在,你將會得到重復創建對象的錯誤。
a、全局臨時表會在創建其的會話結束後被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、不能對臨時表進行分區。

5、不能對臨時表加外鍵約束。

6、臨時表內列的數據類型不能定義成沒有在TempDb中沒有定義自定義數據類型(自定義數據類型是資料庫級別的對象,而臨時表屬於TempDb)。由於TempDb在每次SQL Server重啟後會被自動創建,所以你必須使用startup stored procere來為TempDb創建自定義數據類型。你也可以通過修改Model資料庫來達到這一目標。

7、XML列不能定義成XML集合的形式,除非這個集合已經在TempDb中定義。

臨時表既可以通過Create Table語句創建,也可以通過"SELECT <select_list> INTO #table"語句創建。你還可以針對臨時表用"INSERT INTO #table EXEC stored_procere"這樣的語句。
臨時表可以擁有命名的約束和索引。但是,當兩個用戶在同一時間調用同一存儲過程時,將會產生」There is already an object named 『<objectname>』 in the database」這樣的錯誤。所以最好的做法是不用為建立的對象進行命名,而使用系統分配的在TempDb中唯一的。

三、誤區

誤區1.表變數僅僅在內存中。

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

這兩種觀點都是錯誤的,只有內存足夠,表變數和臨時表都會在內存中創建和處理。他們也同樣可以在任何時間被存入磁碟。

注意表變數的名字是系統分配的,表變數的第一個字元」@」並不是一個字母,所以它並不是一個有效的變數名。系統會在TempDb中為表變數創建一個系統分配的名稱,所以任何在sysobjects或sys.tables查找表變數的方法都會失敗。

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

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

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

誤區3.表變數不能擁有索引。

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

declare @MyTableVariable table (RowID intPRIMARY KEY CLUSTERED)

這個語句將會創建一個擁有聚集索引的表變數。由於主鍵有了對應的聚集索引,所以一個系統命名的索引將會被創建在RowID列上。

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

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

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

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

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

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

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

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

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

四、如何選擇

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

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

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

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

參考:http://www.cnblogs.com/kissdodog/archive/2013/07/03/3169470.html

㈨ sql #臨時表 與@創建的有什麼不同

@創建 創建的是表變數,
臨時表會存儲在硬碟上,而表變數會優先存儲在內存中(內存不夠了再存儲到硬碟中),
所以表變數性能會好一些,讀寫內存要比讀寫硬碟性能好很多。

㈩ SQL資料庫中臨時表,臨時變數和with as關鍵詞創建「臨時表」的區別

SQL資料庫中數據處理時,有時候需要建立臨時表,將查詢後的結果集放到臨時表中,然後在針對這個數據進行操作。
創建「臨時表」(邏輯上的臨時表,可能不一定是資料庫的)的方法有一下幾種:
1.with tempTableName as方法(05之後出現):
with temptable as 其實並沒有建立臨時表,只是子查詢部分(subquery factoring),定義一個SQL片斷,該SQL片斷會被整個SQL語句所用到。有的時候,是為了讓SQL語句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數據的部分。特別對於UNION ALL比較有用。因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用WITH AS短語,則只要執行一遍即可。
http://www.cnblogs.com/zhaowei303/articles/4204805.html