什么是临时表
在MSSQL中,临时表是一类特殊的表。它们仅在当前会话或批处理中存在,并且在结束时自动删除。临时表通常用于存储计算的中间结果。它们可以是本地临时表(在tempdb数据库中创建)或全局临时表(在tempdb的所有连接中创建)。
创建本地临时表
要创建本地临时表,可以使用CREATE TABLE语句,但表名称必须以“#”开头。以下是创建本地临时表的示例:
CREATE TABLE #myTempTable (
ID INT,
Name VARCHAR(50),
Address VARCHAR(100)
)
此语句会在tempdb数据库中创建名为“#myTempTable”的表。然后,可以像任何其他表一样使用它:
INSERT INTO #myTempTable (ID, Name, Address)
VALUES (1, 'John', '123 Main St')
一旦当前会话结束,#myTempTable表就会被删除。
创建全局临时表
要创建全局临时表,表名称必须以“##”开头。以下是创建全局临时表的示例:
CREATE TABLE ##myTempTable (
ID INT,
Name VARCHAR(50),
Address VARCHAR(100)
)
此语句会在tempdb数据库中创建名为“##myTempTable”的表。如果另一个连接尝试使用相同的表名称,它将使用现有的表,而不会创建新的表。全局临时表只能通过两种方式之一删除:
关闭创建它的连接
当连接关闭时,所有全局临时表都会自动删除。由于这些表不是由用户创建的,因此不能手动删除它们。
手动删除它们
要手动删除全局临时表,请使用DROP TABLE语句,并在表名前加上“##”前缀。以下是删除全局临时表的示例:
DROP TABLE ##myTempTable
临时表的使用
临时表通常用于存储中间结果。例如,可以使用临时表来计算某个查询的结果,然后将结果显示给用户。以下是一个示例查询,该查询使用临时表来计算中间结果:
CREATE TABLE #TempTable (
CustomerID INT,
OrderCount INT,
LastOrderDate DATETIME
)
INSERT INTO #TempTable (CustomerID, OrderCount, LastOrderDate)
SELECT
CustomerID,
COUNT(*) AS OrderCount,
MAX(OrderDate) AS LastOrderDate
FROM Orders
GROUP BY CustomerID
SELECT
c.CustomerID,
c.CustomerName,
t.OrderCount,
t.LastOrderDate
FROM Customers c
INNER JOIN #TempTable t ON c.CustomerID = t.CustomerID
ORDER BY t.OrderCount DESC
此查询将所有订单按客户分组,并使用临时表#TempTable计算每个客户的订单数和最后一次订单日期。然后它将客户详细信息与临时表一起使用,以显示按订单数排序的客户列表。
总结
临时表是一种非常有用的工具,可用于存储计算的中间结果。在MSSQL中,它们可以是本地临时表或全局临时表,具有这种表的自动清理功能,使得它们特别适合处理中间结果。