SQL Server临时表和临时表变量辨析

本文深入探讨了SQLServer中临时表与临时表变量的区别,通过实验展示了两者实际上都存储在TempDB数据库中,并演示了如何通过SQL查询操作临时表变量。

SQL Server临时表和临时表变量辨析

http://www.it118.org/specials/c9fba99e-4401-49cf-8256-ac3c1a34c0d9/9018bb9d-54ab-44c9-a1bf-d9a4e66bc571.htm

以前听说临时表存在在TempDB数据库中,而表变量存放在内存中.其实这是错误的.表变量和临时表都存放在TempDB数据库中.我们用下面的两种方法来证明:

1.

 

2.

1.新建表变量,立即插入数据
2.等10秒钟,新建临时表,立即插入数据
3.查询临时表和表变量中的数据
4.查询tempdb.sys.objects表
5.清理临时表

 

 

我们会看到TableVariableTime在tempdb对应的对象名:#73BA3083,对应的对象名以#TempTable开头.

3.

下面我们玩一下,如果我们知道了临时表在tempdb中的名字.根据我们所知道的SQL常识,我们可以使用insert向该表插入记录才对.下面显示一下:

 

  1. DECLARE @TableVariable TABLE (DT DateTime DEFAULT GETDATE() NOT NULL)  
  2.   
  3. DECLARE @SQL VARCHAR(1000)  
  4. DECLARE @Name VARCHAR(50)  
  5.   
  6. SELECT @Name = name   
  7. FROM tempdb.sys.objects  
  8. WHERE type = 'U' AND create_date > DATEADD(s,-2, GETDATE())   
  9.   
  10. SET @SQL = 'INSERT INTO tempdb.dbo.[' + @Name + '] DEFAULT VALUES'  
  11. PRINT 'Table Name: ' + @Name  
  12. PRINT ''  
  13. PRINT 'Query: ' + @SQL  
  14. PRINT ''   
  15.   
  16. EXEC (@SQL)  
  1. Table Name: #407A839F  
  2.    
  3. Query: INSERT INTO tempdb.dbo.[#407A839F] DEFAULT VALUES  
  4.    
  5. 已忽略数据库名称 'tempdb',将引用 tempdb 中的对象。  
  6. 消息 208,级别 16,状态 0,第 1 行  
  7. 对象名  '#407A839F' 无效。  
啊哈,出错了.

  1. --1  
  2. DECLARE @TableVariable TABLE (DT DateTime DEFAULT GETDATE() NOT NULL)  
  3. INSERT INTO @TableVariable DEFAULT VALUES  
  4.   
  5. --2  
  6. WAITFOR DELAY '00:00:10'  
  7.   
  8. CREATE TABLE #TempTable (DT DateTime DEFAULT GETDATE() NOT NULL)  
  9. INSERT INTO #TempTable DEFAULT VALUES  
  10.   
  11. --3  
  12. SELECT DT AS TableVariableTime FROM @TableVariable  
  13. SELECT DT AS TempTableTime FROM #TempTable  
  14.   
  15. --4  
  16. SELECT * FROM tempdb.sys.objects  
  17. WHERE type = 'U'  
  18.   
  19. --5  
  20. DROP TABLE #TempTable  

  1. -- 得到当前的会话ID  
  2. SELECT @@SPID AS Current_SessionID  
  3. -- 检查页面文件的空间使用情况  
  4. SELECT user_objects_alloc_page_count  
  5. FROM sys.dm_db_session_space_usage  
  6. WHERE session_id = (SELECT @@SPID )  
  7. GO  
  8. -- 新建临时表,插入3000行记录  
  9. CREATE TABLE #TempTable (Col1 INT)  
  10. INSERT INTO #TempTable (Col1)  
  11. SELECT TOP 3000 ROW_NUMBER() OVER(ORDER BY a.name)  
  12. FROM sys.all_objects a  
  13. CROSS JOIN sys.all_objects b  
  14. GO  
  15. -- 检查页面文件的空间使用情况  
  16. SELECT user_objects_alloc_page_count  
  17. FROM sys.dm_db_session_space_usage  
  18. WHERE session_id = (SELECT @@SPID )  
  19. GO  
  20. -- 新建表变量,插入3000行记录  
  21. DECLARE @temp TABLE(Col1 INT)  
  22. INSERT INTO @temp (Col1)  
  23. SELECT TOP 3000 ROW_NUMBER() OVER(ORDER BY a.name)  
  24. FROM sys.all_objects a  
  25. CROSS JOIN sys.all_objects b  
  26. GO  
  27. -- 检查页面文件的空间使用情况  
  28. SELECT user_objects_alloc_page_count  
  29. FROM sys.dm_db_session_space_usage  
  30. WHERE session_id = (SELECT @@SPID )  
  31. GO  
  32. -- 删除临时表  
  33. DROP TABLE #TempTable  
  34. GO  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值