在数据库中的TAble分 临时表和表变量:
如下:
CREATE TABLE ##CustomerAddress
(CustomerAddressID int IDENTITY(1,1),
AddressType char(4) NOT NULL,
PrimaryAddressFlag bit NOT NULL,
CountryID int NULL)DECLARE @CustomerAddress TABLE
(CustomerAddressID int IDENTITY(1,1),
AddressType char(4) NOT NULL,
PrimaryAddressFlag bit NOT NULL,
CountryID int NULL)临时表是存放在tempdb,而表变量是存放在mem中?对么?
还想知道以上2种方式分别是在什么情形下使用的?

解决方案 »

  1.   

    临时表: 跟一般表差不多, 只不过是存在tempdb数据库中, 只有当连接(connection)结束或者被主动drop掉, 否则回一直存在, 所以它们也可以有primary key, constraints, index和column statistics.
    跟一般表不一样的是, 临时表虽然在tempdb中显现, 实际上也是在内存中分配的, 除非内存不够的时候, 也可能分配在硬盘里, 但用户在硬盘里肯定找不到.表变量: 就跟临时变量一样, 作用范围非常狭窄, 出了batch就玩完. (一个batch就是一段在SSMS里以GO结束的query组, 或者是一个存储过程). 表变量不能被主动drop掉. 
    跟临时表一样的是, 表变量也存在在tempdb数据库中, 表变量可以有一个primary key, 但不能生成索引, 也不能有column statistics, 所以对大数据的表来说, 表变量可能不大合适.
    Table VariablesCTE(common table expression)
    CTE与其说是一种表, 不如说是一种视图. 如果你仔细研究一下CTE的excution plan的话, 就可以发现很象C语言中的宏(macro)一样, 只是方便写代码而已.
    CTE
      

  2.   

    临时表可以用与存储过程中,便于用户的使用,并且可以自动撤销,存放在tempdb中,有局部和全局的两种,
    而表变量,可以用在函数中
      

  3.   

    http://www.windbi.com/showtopic-90.aspx
    说的比较详细
      

  4.   

    再补充3点:1. 表变量的操作并不记录在transaction log里, 所以对表变量不能用rollback, 而临时表则可以.
    2. 任何有临时表的过程都不能被预编译(pre-compiled),但是有表变量的过程的execution plan却有可能被预先生成.所以从这个意义来看, 表变量的过程要比临时表的过程速度要快.
    3. 表变量跟普通变量一样, 在内层的存储过程和exec(string)过程中是不可见的(临时变量则可以, 几个有个大虾还专门发贴庆贺过这件事), 所以表变量也不能用在insert/exec语句里.