1. 什么是临时表
临时表是一种特殊的表,可以被应用于存储临时的数据和结果集。相比于普通表,临时表只存在于当前会话或者当前执行环境中,当会话或者执行环境结束后,临时表中的数据也会被自动删除。
临时表分为局部临时表
和全局临时表
两种类型。局部临时表只能在创建它的会话中使用,而全局临时表可以被所有会话共享。
-- 创建局部临时表
CREATE TABLE #tmp_table (id INT, name VARCHAR(20));
-- 创建全局临时表
CREATE TABLE ##tmp_table (id INT, name VARCHAR(20));
2. 临时表的生存期
2.1 局部临时表的生存期
局部临时表的生存期只存在于创建它的会话中。当会话结束时,局部临时表和其中的数据会被自动删除。
可以通过IF OBJECT_ID('tempdb..#tmp_table') IS NOT NULL DROP TABLE #tmp_table
手动删除局部临时表,但是如果会话结束后,会自动删除局部临时表和其中的数据,所以无需手动删除。
2.2 全局临时表的生存期
全局临时表的生存期在所有使用该表的会话都结束后,系统会自动删除该表。可以理解为,全局临时表的生存期是在创建它的那个会话结束后开始计算的。
需要注意的是,如果有其他的会话正在使用全局临时表,那么当前会话结束后,全局临时表不会自动删除。
-- 在会话 A 中创建全局临时表
CREATE TABLE ##tmp_table (id INT, name VARCHAR(20));
-- 在会话 B 中使用全局临时表
SELECT * FROM ##tmp_table;
-- 会话 A 结束后,如果没有其他会话使用 ##tmp_table
-- 系统会自动删除该表
3. 如何管理临时表
临时表会在当前会话或者执行环境结束后被自动删除,所以无需手动删除。但是如果需要在使用完临时表后手动删除它,可以使用DROP TABLE
语句。
-- 删除局部临时表
IF OBJECT_ID('tempdb..#tmp_table') IS NOT NULL DROP TABLE #tmp_table;
-- 删除全局临时表
IF OBJECT_ID('tempdb..##tmp_table') IS NOT NULL DROP TABLE ##tmp_table;