sql存儲過程刪除臨時表
Ⅰ sql SERVER鐨勫瓨鍌ㄨ繃紼嬮噷闈錛屽0鏄庣殑涓存椂琛ㄦ槸闇瑕佸湪瀛樺偍榪囩▼緇撴潫鐨勬椂鍊欐墜鍔╠rop鎺夌殑涔堬紵
涓嶉渶瑕佹墜鍔―rop錛#(鏈鍦頒復鏃惰〃)涓存椂琛ㄥ彧鍦ㄥ瓨鍌ㄨ繃紼嬮噷鏈夋晥 (浠呬細璇濆彲浠ヤ嬌鐢)
榪欎富瑕佹牴鎹涓浜虹殑涔犳儻錛屽傛灉甯屾湜TempDB椹涓婂洖鏀惰祫婧愶紝鍙浠ュ湪緇撴潫鏃跺姞涓娿傝繖涓嶅獎鍝嶅瓨鍌ㄨ繃紼嬬殑璋冪敤
涓存椂琛ㄦ湁涓ょ嶇被鍨嬶細鏈鍦拌〃鍜屽叏灞琛ㄣ傚湪涓庨栨″壋寤烘垨寮曠敤琛ㄦ椂鐩稿悓鐨 SQL Server 瀹炰緥榪炴帴鏈熼棿錛屾湰鍦頒復鏃惰〃鍙瀵逛簬鍒涘緩鑰呮槸鍙瑙佺殑銆傚綋鐢ㄦ埛涓 SQL Server 瀹炰緥鏂寮榪炴帴鍚庯紝灝嗗垹闄ゆ湰鍦頒復鏃惰〃銆傚叏灞涓存椂琛ㄥ湪鍒涘緩鍚庡逛換浣曠敤鎴峰拰浠諱綍榪炴帴閮芥槸鍙瑙佺殑錛屽綋寮曠敤璇ヨ〃鐨勬墍鏈夌敤鎴烽兘涓 SQL Server 瀹炰緥鏂寮榪炴帴鍚庯紝灝嗗垹闄ゅ叏灞涓存椂琛ㄣ
鍙傜収:
Ⅱ 存儲過程裡面的臨時表,被查詢一次就被自動釋放掉
存儲過程裡面的臨時表在你調用完存儲過程以後,當然會自動釋放!!!
Ⅲ 在資料庫中臨時表什麼時候會被清除呢
我們仍使用實驗 05中的環境,略去准備數據的過程。
我們仍然使用兩個會話,一個會話 run,用於運行主 SQL;另一個會話 ps,用於進行 performance_schema 的觀察:
主會話線程號為 29,
可以看到寫入的線程是 page_clean_thread,是一個刷臟操作,這樣就能理解數據為什麼是慢慢寫入的。
也可以看到每個 IO 操作的大小是 16K,也就是刷數據頁的操作。
結論:
我們可以看到,
1. MySQL 會基本遵守 max_heap_table_size 的設定,在內存不夠用時,直接將表轉到磁碟上存儲。
2. 由於引擎不同(內存中表引擎為 heap,磁碟中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實驗寫磁碟的數據量和實驗 05中使用內存的數據量不同。
3. 如果臨時表要使用磁碟,表引擎配置為 InnoDB,那麼即使臨時表在一個時間很短的 SQL 中使用,且使用後即釋放,釋放後也會刷臟頁到磁碟中,消耗部分 IO。
Ⅳ SQL server2008 臨時表tempdb如何自動釋放存儲空間
sql server中如何創建,使用,釋放臨時表
drop table #Tmp --刪除臨時表#Tmpcreate 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 intSet @i = 0 Select @Count = Count(Distinct(Wokno)) from #TmpWhile @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 指定的名稱引用臨時表:
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 語句完成後,將自動除去此表。 在存儲過程或觸發器中創建的本地臨時表與在調用存儲過程或觸發器之前創建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所創建的表,例如:
CREATE PROCEDURE Test2ASCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (2)SELECT Test2Col = x FROM #tGOCREATE PROCEDURE Test1ASCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (1)SELECT Test1Col = x FROM #tEXEC Test2GOCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (99)GOEXEC Test1GO
下面是結果集:
(1 row(s) affected)
Test1Col ----------- 1
(1 row(s) affected)
Test2Col ----------- 2
當創建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創建,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。
考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。
Ⅳ SQL存儲過程臨時表問題
1.強調你的存儲過程不規范
--到處多能看到drop
table
##tmp1
,其實第①②drop
table
##tmp1
都可以刪除
多餘的代碼
2.while循環裡面更是不能讓人不唾棄
一個優秀的程序員
寫的代碼就是能讓其他的程序員看得懂
3.臨時表#可以用##也可以用
那樣更簡潔呢
4.建議理清思路
在重新來修改這個
相信你能理解的更透切~