65.9K
CodeProject 正在变化。 阅读更多。
Home

快速概述:SQL Server 2005 中的临时表

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (96投票s)

2009 年 9 月 22 日

CPOL

4分钟阅读

viewsIcon

881918

SQL Server 2005 中临时表的简要概述。

目录

引言

SQL Server 提供了临时表的概念,这在很大程度上帮助了开发人员。这些表可以在运行时创建,并且可以执行普通表可以执行的所有类型的操作。但是,根据表类型,其作用域是有限的。这些表创建在 tempdb 数据库中。

在本文中,我将为初学者快速概述这些临时表。请提供宝贵的建议和反馈以改进本文。 

临时表的不同类型

SQL Server 根据表行为和作用域提供了两种类型的临时表。它们是

  • 本地临时表
  • 全局临时表

本地临时表

本地临时表仅供当前连接的用户使用;当用户断开与实例的连接时,它们会自动删除。本地临时表名以哈希符号 ("#") 开头。

全局临时表

全局临时表的名称以双哈希 ("##") 开头。一旦某个连接创建了该表,它就像永久表一样,任何连接的任何用户都可以访问它。只有在所有连接都关闭后才能删除它。

在 SQL Server 2005 中创建临时表

正如我之前讨论过的,有两种类型的临时表可用。这里我将描述其中的每一种。

本地临时表

下面给出的语法用于在 SQL Server 2005 中创建本地临时表

CREATE TABLE #LocalTempTable(
UserID int,
UserName varchar(50), 
UserAddress varchar(150))

上面的脚本将在 tempdb 数据库中创建一个临时表。我们可以像处理普通表一样在临时表中 insertdelete 记录,例如

insert into #LocalTempTable values ( 1, 'Abhijit','India');

现在从该表中 select 记录

select * from #LocalTempTable

执行所有这些语句后,如果关闭查询窗口并再次执行 "Insert""Select" 命令,它将抛出以下错误

Msg 208, Level 16, State 0, Line 1
Invalid object name '#LocalTempTable'.

这是因为本地临时表的作用域仅限于当前用户的当前连接。

全局临时表

全局临时表的作用域对于特定连接的所有用户都相同。我们需要在全局临时表的名称前加上 "##"。下面是创建全局临时表的语法:  

CREATE TABLE ##NewGlobalTempTable(
UserID int,
UserName varchar(50), 
UserAddress varchar(150))

上面的脚本将在tempdb 数据库中创建一个临时表。我们可以像处理普通表一样在临时表中 insertdelete 记录,例如

insert into ##NewGlobalTempTable values ( 1, 'Abhijit','India');

现在从该表中选择记录

select * from ##NewGlobalTempTable

全局临时表对所有 SQL Server 连接都可见。创建其中一个后,所有用户都可以看到它。

临时表的存储位置

临时表存储在 tempdb 的临时文件夹中。每当我们创建临时表时,它都会进入 tempdb 数据库的临时文件夹

TempTableLocation.JPG

现在,如果我们深入查看本地临时表的名称,每个表名都会与一个 ID 关联一个 '-'。看下面的图片

LocalTable.JPG - Click to enlarge image

SQL Server 会自动处理所有这些,我们无需担心,只需使用表名即可。 

何时使用临时表?

以下是可以使用临时表的场景

  • 当我们在存储过程中进行大量行操作时。
  • 这对于替换游标很有用。我们可以将结果集数据存储到临时表中,然后从那里操作数据。
  • 当我们有一个复杂的 join 操作时。

使用临时表之前需要注意的事项

  • 临时表创建在 SQL Server 的 tempdb 上。这是一个单独的数据库。因此,这会增加额外的开销,并可能导致性能问题。
  • 行数和列数应尽可能少。
  • 完成工作后应删除表。

替代方法:表变量

临时表的替代方法是表变量,它可以执行我们在 Temp 表中可以执行的所有类型的操作。下面是使用表变量的语法。

Declare @TempTableVariable TABLE(
UserID int,
UserName varchar(50), 
UserAddress varchar(150))

下面的脚本用于 insert 和读取 Tablevariable 的记录

insert into @TempTableVariable values ( 1, 'Abhijit','India');

现在从该 tablevariable 中选择记录

select * from @TempTableVariable

何时使用表变量而不是临时表

Tablevariable始终适用于少量数据。如果结果集返回大量记录,我们需要选择临时表。

参考和进一步研究 

历史

  • 2009 年 9 月 23 日:首次发布
© . All rights reserved.