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

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

我们会看到TableVariableTime在tempdb对应的对象名:#73BA3083,对应的对象名以#TempTable开头.
3.
下面我们玩一下,如果我们知道了临时表在tempdb中的名字.根据我们所知道的SQL常识,我们可以使用insert向该表插入记录才对.下面显示一下:
- DECLARE @TableVariable TABLE (DT DateTime DEFAULT GETDATE() NOT NULL)
- DECLARE @SQL VARCHAR(1000)
- DECLARE @Name VARCHAR(50)
- SELECT @Name = name
- FROM tempdb.sys.objects
- WHERE type = 'U' AND create_date > DATEADD(s,-2, GETDATE())
- SET @SQL = 'INSERT INTO tempdb.dbo.[' + @Name + '] DEFAULT VALUES'
- PRINT 'Table Name: ' + @Name
- PRINT ''
- PRINT 'Query: ' + @SQL
- PRINT ''
- EXEC (@SQL)
- Table Name: #407A839F
- Query: INSERT INTO tempdb.dbo.[#407A839F] DEFAULT VALUES
- 已忽略数据库名称 'tempdb',将引用 tempdb 中的对象。
- 消息 208,级别 16,状态 0,第 1 行
- 对象名 '#407A839F' 无效。
- --1
- DECLARE @TableVariable TABLE (DT DateTime DEFAULT GETDATE() NOT NULL)
- INSERT INTO @TableVariable DEFAULT VALUES
- --2
- WAITFOR DELAY '00:00:10'
- CREATE TABLE #TempTable (DT DateTime DEFAULT GETDATE() NOT NULL)
- INSERT INTO #TempTable DEFAULT VALUES
- --3
- SELECT DT AS TableVariableTime FROM @TableVariable
- SELECT DT AS TempTableTime FROM #TempTable
- --4
- SELECT * FROM tempdb.sys.objects
- WHERE type = 'U'
- --5
- DROP TABLE #TempTable
- -- 得到当前的会话ID
- SELECT @@SPID AS Current_SessionID
- -- 检查页面文件的空间使用情况
- SELECT user_objects_alloc_page_count
- FROM sys.dm_db_session_space_usage
- WHERE session_id = (SELECT @@SPID )
- GO
- -- 新建临时表,插入3000行记录
- CREATE TABLE #TempTable (Col1 INT)
- INSERT INTO #TempTable (Col1)
- SELECT TOP 3000 ROW_NUMBER() OVER(ORDER BY a.name)
- FROM sys.all_objects a
- CROSS JOIN sys.all_objects b
- GO
- -- 检查页面文件的空间使用情况
- SELECT user_objects_alloc_page_count
- FROM sys.dm_db_session_space_usage
- WHERE session_id = (SELECT @@SPID )
- GO
- -- 新建表变量,插入3000行记录
- DECLARE @temp TABLE(Col1 INT)
- INSERT INTO @temp (Col1)
- SELECT TOP 3000 ROW_NUMBER() OVER(ORDER BY a.name)
- FROM sys.all_objects a
- CROSS JOIN sys.all_objects b
- GO
- -- 检查页面文件的空间使用情况
- SELECT user_objects_alloc_page_count
- FROM sys.dm_db_session_space_usage
- WHERE session_id = (SELECT @@SPID )
- GO
- -- 删除临时表
- DROP TABLE #TempTable
- GO
本文深入探讨了SQLServer中临时表与临时表变量的区别,通过实验展示了两者实际上都存储在TempDB数据库中,并演示了如何通过SQL查询操作临时表变量。

9476

被折叠的 条评论
为什么被折叠?



