临时表或暂存表可以在运行时创建,并执行常规表可以执行的所有操作。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 的标识列。请刷新对象资源管理器以查看新创建的本地临时表。

如何在 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)
我们已成功将四条随机记录插入到本地临时表中。

从本地临时表中选择数据
让我使用SELECT 语句来选择本地临时表中存在的记录。
SELECT [FirstName], [LastName], [Occupation], [YearlyIncome], [Sales] FROM #Emp

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

如您所见,本地临时表抛出错误,提示对象名称 #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 列。查看新创建的全局临时表。

插入数据到全局临时表
让我使用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

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

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

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