SQL SERVER臨時表的使用
SQL SERVER臨時表的使用
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
--刪除臨時表#Tmp
create table #Tmp --建立臨時表#Tmp
(
ID int IDENTITY (1,1) not null, --建立列ID,並且每次新增一條記錄就會加1
WokNo varchar(50),
primary key (ID) --定義ID為臨時表#Tmp的主鍵
);
Select * from #Tmp --查詢臨時表的資料
truncate table #Tmp --清空臨時表的所有資料和約束
相關例子:
Declare @Wokno Varchar(500) --用來記錄職工號
Declare @Str NVarchar(4000) --用來存放查詢語句
Declare @Count int --求出總記錄數
Declare @i int
Set @i = 0
Select @Count = Count(Distinct(Wokno)) from #Tmp
While @i < @Count
Begin
Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)'
Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output
Select @WokNo,@i --一行一行把職工號顯示出來
Set @i = @i + 1
End
臨時表
可以建立本地和全域性臨時表。本地臨時表僅在當前會話中可見;全域性臨時表在所有會話中都可見。
本地臨時表的名稱前面有一個編號符 (#table_name),而全域性臨時表的名稱前面有兩個編號符 (##table_name)。
SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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 語句完成後,將自動除去此表。
在儲存過程或觸發器中建立的本地臨時表與在呼叫儲存過程或觸發器之前建立的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該
查詢。巢狀儲存過程同樣可以建立與呼叫它的儲存過程所建立的臨時表同名的臨時表。巢狀儲存過程中對錶名的所有引用都被解釋為是針對該巢狀過程所建立的表,例如:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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 約束中不能引用臨時表。
考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地建立索引時,或多個儲存過程或函式需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。
=======================================================================================================================================================
表和表變數有什麼區別?
什麼時候用表好,什麼時候用表變數好?
--------------------------------
表是實體,資料儲存在資料庫檔案內。
表變數是一種特殊變數,只對當前會話有效。
-----------------------------------------
對於表變數,《聯機叢書》如下描述:
一種特殊的資料型別,用於儲存結果集以供後續處理。該資料型別主要用於臨時儲存一組行,這些行將作為表值函式的結果集返回。
儘可能使用表變數而不使用臨時表。table 變數有以下優點:
·table 變數的行為類似於區域性變數,有明確定義的作用域。該作用域為宣告該變數的函式、儲存過程或批處理。
在其作用域內,table 變數可像常規表那樣使用。該變數可應用於 SELECT、INSERT、UPDATE 和 DELETE 語句中用到表或表的表示式的地方。但是,table 不能用在下列語句中:
INSERT INTO table_variable EXEC 儲存過程。
SELECT select_list INTO table_variable 語句。
在定義 table 變數的函式、儲存過程或批處理結束時,自動清除 table 變數。
·表型別宣告中的 CHECK 約束、DEFAULT 值和計算列不能呼叫使用者定義函式。
·在儲存過程中使用 table 變數與使用臨時表相比,減少了儲存過程的重新編譯量。
·涉及表變數的事務只在表變數更新期間存在。這樣就減少了表變數對鎖定和記錄資源的需求。
·不支援在表變數之間進行賦值操作。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> declare @t1 table(t1 int)
declare @t2 table(t2 int)
set @t1=@t2 --錯誤
·另外,由於表變數作用域有限,並
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-681755/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL server 中的臨時表SQLServer
- SQL Server中的臨時表和表變數SQLServer變數
- sql server 建臨時表修改資料SQLServer
- SQL Server中臨時表與表變數的區別SQLServer變數
- sql server 儲存過程中使用變數表,臨時表的分析(續)SQLServer儲存過程變數
- SQL建立臨時表SQL
- 利用SQL Server的全域性臨時表防止使用者重複登入 (轉)SQLServer
- SQL Server通過建立臨時表遍歷更新資料SQLServer
- oracle 臨時表的使用Oracle
- SQLServer臨時表的使用SQLServer
- SQL Server的巢狀儲存過程中使用同名的臨時表怪像淺析SQLServer巢狀儲存過程
- 在T-SQL中使用臨時表的注意事項SQL
- 臨時表在Oracle資料庫與SQL Server資料庫中的異同Oracle資料庫SQLServer
- Oracle的臨時表Oracle
- 臨時表的操作
- ORACLE臨時表和SQLSERVER臨時表異同OracleSQLServer
- Oracle臨時表使用注意事項Oracle
- 【臨時表空間】11g中使用 SHRINK方法縮小臨時表空間和臨時檔案
- oracle11g 查詢臨時表空間的使用率和正在使用臨時表空間的使用者Oracle
- 【臨時表空間】11g中使用 SHRINK方法縮小臨時表空間和臨時檔案(續)
- MySQL 中的臨時表MySql
- oracle臨時表的用法Oracle
- MySQL臨時表MySql
- PostgreSQL:臨時表SQL
- oracle臨時表Oracle
- Oracle 臨時表Oracle
- 【儲存管理】建立臨時表空間組、建立臨時表空間組及使用
- 查詢過去一段時間內某條sql使用的臨時表空間大小SQL
- SQL SERVER 臨時表導致儲存過程重編譯(recompile)的一些探討SQLServer儲存過程編譯Compile
- 關於Oracle臨時表的使用的小經歷Oracle
- 插敘那些sql和那些sessioin用的臨時表空間SQL
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- SQL Server 觸發器中的兩個臨時表inserted及deleted,其資料從何而來?SQLServer觸發器delete
- mysql的內部臨時表MySql
- oracle的臨時表空間Oracle
- mysql臨時表的問題MySql
- oracle臨時表的用法(轉)Oracle
- MySQL什麼時候會使用內部臨時表?MySql