临时表的作用域

来源:互联网 发布:贪心算法的时间复杂度 编辑:程序博客网 时间:2024/05/18 00:52

SQL Server 支持临时表。临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。

临时表有两种类型:

本地临时表
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表。

全局临时表
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。
--应用本地临时表
declare@sqlvarchar(100)
set@sql='select''123''as a,''abasdf''as b into #t'
exec(@sql)
select*from#t
go
/*发现不能正确显示临时表的数据
提示:
服务器: 消息 208,级别 16,状态 1,行 5
对象名 '#t' 无效。
*/

--修改为全局临时表
declare@sqlvarchar(100)
set@sql='select''123''as a,''abasdf''as b into ##t'
exec(@sql)
select*from##t
droptable##t
go
/*可以正确显示临时表的数据
分析原因:exec(@sql) 相当于重新建立一个数据库对话,所以对于本地临时表,使用exec(@sql)创建临时表,
在exec外部不能正确访问;而使用全局临时表就ok了