SQL Server 临时表

17 Mar 2025 | 6 分钟阅读

SQL Server 中的临时(temp)表是一种特殊的表,它不能永久存储在数据库服务器上。这个表会保存一个常规表的数据子集,并且可以在一个特定的会话中重复使用。我们不能将此表存储在内存中。由于此表临时存在于当前的数据库服务器上,因此当当前会话结束或用户终止数据库连接时,它会自动删除。我们可以在系统数据库“tempdb”中找到临时表。

当一个表中有很多记录,而我们只需要经常处理其中一小部分记录时,临时表非常方便。在这种情况下,我们可以只过滤一次数据并将其保存在临时表中,而不是多次过滤数据来获取所需数据。之后,我们就可以在该临时表上运行查询。因此,临时表具有一项功能,可以帮助我们快速完成复杂的任务。

在 SQL Server 中创建临时表

我们可以通过两种方式创建临时表

  1. SELECT INTO
  2. CREATE TABLE 语句

让我们首先创建一个表来演示两种方式的临时表。以下语句在示例数据库中创建了一个名为'Student'的表

我们可以使用 SELECT 语句来验证该表。它将显示如下表

SQL Server Temp Table

使用 SELECT INTO 语句创建的临时表

SELECT INTO 语句是在 SQL Server 中创建临时表的最简单方法。我们通常使用此方法来保存中间结果,以便在同一会话中重复使用。

以下语法演示了如何使用 SELECT INTO 语句创建临时表

临时表的名称始终以哈希符号(#)开头。哈希符号告诉 SQL Server 正在处理临时表。例如,下面的查询使用 SELECT INTO 语句在 tempdb 数据库中创建了一个临时表。我们只能在创建临时表的会话中使用此表。

正如我们在上面的语句中看到的,它使用 SELECT 语句创建了一个名为"#MaleStudents"的临时表,其中包含三个列(name, age, 和 gender)。它从包含所有男性学生记录的姓名、年龄和性别的'Student'表中填充了数据。我们不应忘记临时表名在其名称的开头必须有一个哈希(#)符号。

执行语句后,我们可以通过以下路径访问 SQL Server Management Studio 来查看临时表的位置:对象资源管理器 -> 数据库 -> 系统数据库 -> tempdb -> 临时表。在这里,我们得到临时表的名称以及哈希符号。请看下图

SQL Server Temp Table

正如我们在图像中看到的,临时表名称的末尾还有一个序列号。它表示 SQL Server 为每个临时表创建的唯一标识符,用于区分临时表。创建此项是因为多个数据库连接可能具有多个临时表的相同名称。

现在,我们可以在创建它的连接中对临时表执行 SQL 操作。例如,如果我们想获取所有男性学生的详细信息,则可以执行以下查询

此语句将获取以下记录

SQL Server Temp Table

使用 CREATE TABLE 语句创建的临时表

CREATE TABLE 语句是创建临时表的第二种方法。下面的语句将创建一个名为 #FemaleStudents 的临时表。如果我们想创建一个相同的表(例如 #MaleStudents),则需要将当前数据库更改为新连接。

以下是使用 CREATE TABLE 语句创建临时表的查询

正如我们在语句中看到的,它与创建普通表类似。唯一的区别是临时表的名称以哈希(#)符号开头。

接下来,我们将像添加普通表一样向此表中添加记录

现在,我们可以在当前会话中按如下方式查询数据

SQL Server Temp Table

如果我们尝试在另一个连接中查询上述表,SQL Server 将抛出以下错误消息

SQL Server Temp Table

SQL Server 抛出此错误是因为临时表只能在生成它们的会话中访问。

临时表的类型

SQL Server 将临时表分为两种类型

  1. 本地临时表
  2. 全局临时表

本地临时表

本地临时表存储在 tempdb 中,并且仅对创建它们的会话可见。当我们在 SQL Server 实例中关闭连接时,这些表会自动销毁。我们可以使用哈希(#)符号作为前缀来定义本地临时表的名称。可以在多个连接中以相同的名称创建临时表。

我们可以使用以下语法在 SQL Server 中创建本地临时表:

我们已经在上面的临时表示例中看到了这些,它们也解释了本地临时表。

全局临时表

全局临时表存储在 tempdb 中,并且对所有用户和所有会话都可见。当引用该表的所有用户断开连接或使用该表的最后一个会话完成后,这些表会自动销毁。我们可以使用双哈希(##)符号作为前缀来定义全局临时表的名称。

我们可以使用以下语法在 SQL Server 中创建全局临时表:

示例

以下示例解释了全局临时表的创建。在这里,我们创建了一个名为"##FemaleStudents"的临时表,它存储在 tempdb 系统数据库中。

我们可以按如下方式查询此表

SQL Server Temp Table

如何删除临时表?

SQL Server 允许我们通过两种方式删除临时表

  1. 自动
  2. 手动

自动删除

当我们关闭创建临时表的连接时,SQL Server 会自动删除该临时表。SQL Server 会在关闭创建它们的连接时删除全局临时表,并且其他连接中引用该表的查询已完成。

手动删除

我们可以使用DROP TABLE语句手动从创建临时表的连接中删除临时表。语法如下

如果我们要删除多个临时表,则需要提供逗号分隔的表名。请参阅以下语法

临时表与常规表

以下比较图解释了临时表和常规表之间的主要区别

常规表临时表
常规表是永久存储在硬盘文件中的表。临时表存储在 tempdb 系统数据库中,而不是物理位置。
常规表加载数据速度较慢,因为它存储在硬盘上并在日志文件中记录修改。临时表加载数据速度较快,因为它存储在 tempdb 中,并且修改不会记录在日志文件中。
系统将手动删除每个常规表。系统可以隐式删除每个临时表。