SQL Server 中的临时表

临时表或暂存表可以在运行时创建,并执行常规表可以执行的所有操作。SQL Server 中有两种类型的临时表:本地临时表和全局临时表。让我们看看如何使用本地和全局临时表。

以下列表显示了我们可以使用 SQL Server 本地临时表和全局临时表的位置

  • 当我们处理复杂的连接时,存储临时数据。
  • 它们有助于替代成本高昂的游标。我们可以使用它们来存储结果集数据并从中操作数据。
  • 当在存储过程中进行大量行操作时,我们可以使用这些临时表。请记住,如果我们在存储过程内部为中间结果创建此表,则它仅适用于该存储过程。这意味着您无法在存储过程外部调用它们。

在 SQL Server 中创建本地临时表

本地临时表的名称以哈希 (“#”) 符号开头,并存储在 tempdb 中。本地临时表仅在当前连接中可用。如果用户断开当前实例连接或关闭查询窗口,它将自动删除。

SQL Server 本地临时表语法

本地临时表的语法

CREATE TABLE #[LocalName]
(
    Column_Name1 Data_Type(Size) [NULL | NOT NULL],
    Column_Name2 Data_Type(Size) [NULL | NOT NULL],
     …
    Column_NameN Data_Type(Size) [NULL | NOT NULL]
);

这是一个简单的创建表语句。在这里,LocalName 应该以 # 开头。请记住,请提供一个唯一的名称。如果您提供现有名称,它将引发错误。

让我们创建一个名为 Emp 的表。

CREATE TABLE #Emp
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[FirstName] [nvarchar](255) NULL,
	[LastName] [nvarchar](255) NULL,
	[Occupation] [nvarchar](255) NULL,
	[YearlyIncome] [float] NULL,
	[Sales] [float] NULL
)

我们创建了一个临时表并声明了 6 列。这里,我们的第一列是整数数据类型的 ID,不允许 NULL 值。我们还将此列定义为从 1 开始并递增 1 的标识列。请刷新对象资源管理器以查看新创建的本地临时表。

Create Local Temp Table in SQL Server 1

如何在 SQL Server 中向本地临时表插入数据?

让我使用INSERT 语句向我们在 tempdb 中创建的本地临时表插入一些随机或示例记录。

INSERT INTO #Emp (
	    [FirstName], [LastName], [Occupation], [YearlyIncome], [Sales])
VALUES ('Tutorial', 'Gateway', 'Education', 10000, 200)
      ,('Imran', 'Khan', 'Skilled Professional', 15900, 100)
      ,('Doe', 'Lara', 'Management', 15000, 60)
      ,('Ramesh', 'Kumar', 'Professional', 65000, 630)

我们已成功将四条随机记录插入到本地临时表中。

Insert Data into the Local Temp Table 2

从本地临时表中选择数据

让我使用SELECT 语句来选择本地临时表中存在的记录。

SELECT [FirstName], [LastName], [Occupation], [YearlyIncome], [Sales]
FROM #Emp
Select Rows 3

到现在为止,您可能想知道为什么我将 Create、Insert 和 Select 语句写在一个查询窗口中。因为本地临时表只持续到单个会话,如果您尝试从新的查询窗口调用它,它将引发错误。例如,让我从新的查询窗口调用 #Emp。

从下面的屏幕截图中,您可以看到它不包含我们的 #Emp。

Error Accessing 4

如您所见,本地临时表抛出错误,提示对象名称 #LocalTemp 无效。让我关闭所有现有的查询窗口,并从对象资源管理器中刷新 tempdb。

在 SQL Server 中创建全局临时表

它的名称以双哈希 (“##”) 符号开头,并存储在 tempdb 中。这些类似于永久表,可供该实例中的所有用户使用。如果所有用户都断开会话连接,全局临时表将自动删除。

全局临时表语法

SQL Server Management Studio 中全局临时表的语法。

CREATE TABLE ##[Global Temp Name]
(
    Column_Name1 Data_Type(Size) [NULL | NOT NULL],
    Column_Name2 Data_Type(Size) [NULL | NOT NULL],
     …
    Column_NameN Data_Type(Size) [NULL | NOT NULL]
);

全局临时表的名称应以 ## 开头。请提供一个唯一的名称;否则,它将引发错误。让我们创建一个名为 Cust 的全局临时表

CREATE TABLE ##Cust
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[FirstName] [nvarchar](255) NULL,
	[LastName] [nvarchar](255) NULL,
	[Education] [nvarchar](255) NULL,
	[Occupation] [nvarchar](255) NULL,
	[YearlyIncome] [float] NULL,
	[Sales] [float] NULL
)

我们为其声明了 7 列。查看新创建的全局临时表。

Create Global Temp Table in Sql Server 5

插入数据到全局临时表

让我使用INSERT 语句向我们在 tempdb 中创建的全局临时表插入一些示例或随机记录。

INSERT INTO ##Cust (
	    [FirstName], [LastName], [Education], [Occupation], [YearlyIncome], [Sales])
VALUES ('Tutorial', 'Gateway', 'Masters Degree', 'Teaching', 12000, 200)
      ,('Imran', 'Khan', 'Bachelors', 'Skilled Professional', 13900, 100)
      ,('Doe', 'Lara', 'Degree', 'Management', 25000, 60)
      ,('Ramesh', 'Kumar', 'Bachelors', 'Professional', 35400, 630)

从 SQL Server 的全局临时表中选择

这里,我们成功地将 4 条随机记录插入到 ##Cust 中。因此,让我使用SELECT 语句来选择该全局临时表中存在的记录。

SELECT [FirstName], [LastName], [Education], [Occupation], [YearlyIncome], [Sales] 
FROM ##Cust
Insert Rows into Global

接下来,让我从新的查询窗口调用 ##Cust 全局表

Select Records from Global Temp Table

它显示记录,而不是抛出错误。现在,让我关闭所有现有的查询窗口,并从对象资源管理器中刷新 tempdb。

Delete Temp Table

现在您可以看到 tempdb 数据库中没有任何内容。请参考游标存储过程文章。