1. 临时表适用数据量较大的情况,因为临时表可以建立索引
2. 表变量适用于数据较小的情况,表变量只能在定义时创建约束(PRIMARY KEY/UNIQUE)从而间接建立索引
3. 临时表是事务性的,数据会随着事务回滚而回滚,表变量是非事务性的
4. 临时表和表变量都存放在内存中,当内存存在压力时才放入到硬盘
5. 临时表属于回话级别,除非显式DROP,否则会一直保持到回话结束
6. 表变量属于上下文级别,当前批处理结束后会被立即释放。
7. 临时表的创建删除会导致存储过程重编译,而在存储过程中使用表变量不会引发重编译
8. 用户定义的临时对象(临时表、全局临时表、表变量、游标)都优先存放到内存
9. 临时表和表变量在数据操作时产生的日志远远低于普通表
10.除非使用 DROP TABLE 显式删除临时表,否则临时表将在退出其作用域时由系统自动删除:
1)当存储过程完成时,将自动删除在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
2)所有其他本地临时表在当前会话结束时都将被自动删除。
3)全局临时表在创建此表的会话结束且其他所有任务停止对其引用时将被自动删除。任务与表之间的关联只在单个 Transact-SQL语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动删除此表。
--==========================================================
--创建临时表
CREATE TABLE #T4
(
[ID] [int] NOT NULL,
[STEP] [nvarchar](200) NULL,
[DT] [datetime] NULL
)
--==========================================================
--创建临时表
DECLARE @T4 TABLE
(
[ID] [int] NOT NULL,
[STEP] [nvarchar](200) NULL,
[DT] [datetime] NULL
)
--==========================================================
--创建用户定义表类型,使用表类型定义变量
CREATE TYPE dbo.myTB AS TABLE
(
[ID] [int] NOT NULL,
[STEP] [nvarchar](200) NULL,
[DT] [datetime] NULL
)
DECLARE @T4 dbo.myTB