你的位置:首页 > 数据库

[数据库]关于临时表和表变量的差别2

又是想到什么写什么系列……上次 http://www.cnblogs.com/Gin-23333/p/5096638.html 写了一下,今天补充点其它的

1、在事务里面的影响,临时表可以被回滚 而表变量是不能回滚的。简单的例子

DECLARE @T AS TABLE(ID INT,Name NVARCHAR(50))IF OBJECT_ID('tempdb..#T') IS NOT NULL  DROP TABLE #TCREATE TABLE #T (ID INT,Name NVARCHAR(50))BEGIN TRAN  INSERT INTO @T      ( ID, Name )  VALUES ( 1,N'Col1' );  INSERT INTO #T      ( ID, Name )  VALUES ( 1,N'Col1' );ROLLBACKSELECT * FROM @TSELECT * FROM #T@TID     Name----------- --------------------------------------------------1      Col1#TID     Name----------- --------------------------------------------------

 

 

2、临时表定义好之后可以通过DDL语句修改结构,但是表变量就不行了

DECLARE @T AS TABLE(ID INT PRIMARY KEY,Name NVARCHAR(50))IF OBJECT_ID('tempdb..#T') IS NOT NULL  DROP TABLE #TCREATE TABLE #T (ID INT PRIMARY KEY,Name NVARCHAR(50))ALTER TABLE #T ADD Col1 nvarchar(50);SELECT * FROM #TALTER TABLE @T1 ADD Col1 nvarchar(50);SELECT * FROM @T

消息 102,级别 15,状态 1,第 16 行
“@T1”附近有语法错误。
消息 102,级别 15,状态 1,第 16 行
“Col1”附近有语法错误。


 

 

3、临时表可以定义外键,但是表变量是不行的(这里代码就不写了╮(╯_╰)╭,)

4、临时表可以创建索引,表变量是不行的,所以中间缓存结果会比较大的时候,可以适当使用临时表创建索引来进行优化。

5、表变量不维护统计数据。这意味着任何表变量数据更改都不会引起相关查询语句进行重编译

6、表变量可以引用用户自定义数据类型,临时表并不能,因为临时表引用的是tempdb,而里面并没有定义该用户自定义类型。

暂时想到这么多╮(╯_╰)╭,如果想到新的东西再分享